В C++ ofstream и vector пишем пустой файл

Когда я запускаю свой код, в приведенном ниже векторе хранятся правильные данные, но по какой-то причине он неправильно записывает в жестко закодированный путь к файлу, вместо этого он оставляет пустой текстовый файл. Я уверен, что это нечто простое, что я пропускаю.

ОБНОВЛЕНО: Вот более полный код.

// Declare the necessary include(s)
#include <iostream>
#include <vector>
#include "Account.h"

/* main function
Purpose: To test the creation of two classes & make sure they output correctly
Parameters: None
Returns: an int (0) */
int main()
{
    // Declare local variable
    int i = 0;

    // Create a vector of Account objects.
    vector <Random> randomVector;

    // Create three person objects.
    Person bob("billy bob", "bobsway");
    Person joe("joe joe", "cityofjoe");
    Person george("george jack", "georgetown");

    // Create three Account objects, where each account object contains a Person object.
    Account bobby(bob, 1, 500);
    Account joseph(joe, 2, 1000);
    Account george(george, 3, 1200);

    // Push these Account objects into the vector.
    randomVector.push_back(bobby);
    randomVector.push_back(joseph);
    randomVector.push_back(george);

    // Create an ofstream object
    ofstream oDataAccount("accountData.txt");

    // Create a loop to write Account data to a file
    for (i = 0; i < randomVector.size(); i++)
    {
        // Flush the output file
        oDataAccount.flush();

        // Write the data from each object in the vector
        randomVector[i].writeData(oDataAccount);
    }

    // Close the file.
    oDataAccount.close();

// Keep the console window open with PAUSE
    system("PAUSE");

    // Return a 0
    return 0;

}// End main

Класс учетной записи

// Include pragma once
#pragma once
#include "Person.h"

class Account
{

private:

    Person aPerson;
    int accountNum;
    double accountBalance;

public:

    Account();

    Account(const Person, int, double);

    Person getPerson();

    int getAccountNum();

    double getAccountBalance();

    // writeData function
    void writeData(ofstream&);

};

// Include the Account header file
#include "Account.h"

Account::Account()
{
    // Initializes data members
}

Account::Account(const Person p, int accNum, double accBal)
{
    aPerson = p;
    accountNum = accNum;
    accountBalance = accBal;
}

Person Account::getPerson()
{
    return aPerson;
}

int Account::getAccountNum()
{
    return accountNum;
}

double Account::getAccountBalance()
{
    return accountBalance;
}

// Implementation for writeData function
void Account::writeData(ofstream& output)
{
    // Write class data to the file
    output << getPerson().getName() << ' ' << getPerson().getAddress() << ' ' << getAccountNum() << ' ' << getAccountBalance();
}

Персональный класс

#pragma once
#include <string>
#include <fstream>
using namespace std;

class Person
{

private:

    string name;
    string address;

public:

    Person();

    Person(const string, const string);

    string getName();

    string getAddress();

};

#include "Person.h"

Person::Person()
{
}

Person::Person(const string n, const string a)
{
    name = n;
    address = a;
}

string Person::getName()
{
    // Return the name
    return name;
}

string Person::getAddress()
{
    // Return the address
    return address;
}

2 ответа

Решение

Если я применяю эти изменения к вашему коду ("-" удаляются строки, добавляются "+")

--- a/main.cpp
+++ b/main.cpp
@@ -13,7 +13,7 @@ int main()
     int i = 0;

     // Create a vector of Account objects.
-    vector <Random> randomVector;
+    vector <Account> randomVector;

     // Create three person objects.
     Person bob("billy bob", "bobsway");
@@ -23,12 +23,12 @@ int main()
     // Create three Account objects, where each account object contains a Person object.
     Account bobby(bob, 1, 500);
     Account joseph(joe, 2, 1000);
-    Account george(george, 3, 1200);
+    Account georgy(george, 3, 1200);

     // Push these Account objects into the vector.
     randomVector.push_back(bobby);
     randomVector.push_back(joseph);
-    randomVector.push_back(george);
+    randomVector.push_back(georgy);

     // Create an ofstream object
     ofstream oDataAccount("accountData.txt");
@@ -47,7 +47,7 @@ int main()
     oDataAccount.close();

 // Keep the console window open with PAUSE
-    system("PAUSE");
+    //system("PAUSE");

     // Return a 0
     return 0;

Я в конечном итоге с accountData.txt, который выглядит следующим образом:

billy bob bobsway 1 500
joe joe cityofjoe 2 1000
george jack georgetown 3 1200

Таким образом, модифицированный код выглядит нормально. Это на Ubuntu 14.04, компилятор g++ 4.8.4. Какую ОС и компилятор вы используете?

Есть ли randomVector есть какие-либо данные? Потому что, если нет, ваш файл будет пустым, потому что ничего не будет записано.

Кроме того, действительно ли необходимо открыть этот файл для записи, если у вас нет данных? Я бы сначала проверил, есть ли у вектора какие-либо данные, например:

if(!randomVector.empty())
{ 
    // Your code here!
}

Я не знаю что getStuff() а также getMoreStuff() возвращает, но по крайней мере вы должны увидеть определенный пробел в файле, но только если в вашем векторе есть некоторые элементы.

Другие вопросы по тегам