В 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()
возвращает, но по крайней мере вы должны увидеть определенный пробел в файле, но только если в вашем векторе есть некоторые элементы.