在我的代码中:
int newEntry()
{
string input;
Client person;
char response = 'y';
//create file object and open file
fstream customer("customer.dat", ios::out | ios::app);
if (!customer)
{
cout << "Error opening file. Program aborting." << endl;
return 0;
}
do
{
cout << "Enter person information:" << endl << endl;
cout << "Name: " << endl;
getline(cin, input);
strcpy(person.name, input.c_str());
cout << endl << "Street Adress (And Apartment Number):" << endl;
cin >> person.address1;
getline(cin, input);
strcpy(person.address1, input.c_str());
cout << endl << "City, State, Zipcode: " << endl;
cin >> person.address2;
getline(cin, input);
strcpy(person.address2, input.c_str());
cout << endl << "Phone: " << endl;
cin >> person.phone;
getline(cin, input);
strcpy(person.phone, input.c_str());
cout << endl << "Account Balance: " << endl;
cin >> person.acctBal;
//input validation to ensure a non neg number
cin.ignore();
cout << endl << "Last Payment: " << endl;
cin >> person.lastPay;
//input validation to ensure a non neg number
customer.write(reinterpret_cast<char *>(&person),
sizeof(person));
cout << endl << "Do you want to enter another record? (Enter Y for Yes, N
for No) " << endl;
cin >> response;
cout << "_______________________________________________" << endl << endl;
if (toupper(response) == 'Y')
{
cin.ignore();
}
} while (toupper(response) == 'Y');
customer.close();
return 1;
}
好像是块:
cout << endl << "Street Address (And Apartment Number):" << endl;
cin >> person.address1;
getline(cin,input);
strcpy(person.address1, input.c_str());
及其相邻地址2提示符(相同)在
时导致文件输出错误 customer.write(reinterpret_cast<char *>(&person),sizeof(person));
用于写入文件。输出缺少第一个单词。例如,如果输入“211 Harvey Road”,则211将被切断。另一个例子,如果进入“哈维路”,似乎“哈维”被切断了。当(在另一个函数中)读取文件时,数组的结构缺少开头和文件。
最重要的是,在文本文件中,这是写入它的数据:
Frank Palmasani ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ Harvey Road ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ Haven, Alabama ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ 504617772 ÌÌÌÌ èŽ@ èŽ@James Harris ni ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ Street AVEN ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ China. Alabama ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ 546457474 ÌÌÌÌ ð? ð?
正如您所看到的,Ì
弹出的位置是文件和程序以某种方式丢失第一个单词的位置。我已经尝试了所有我能想到的解决这个问题的方法,希望其他人遇到过类似的问题。
我尝试更改将数组结构中保存的数据保存到文件的方法,但发现我无法从一个大型分组中读取文件。在我的教科书中,使用了我用来读出文件的方法,这是我认为应该遵循的方法。
但是,我正在考虑在每一行上单独编写每一行,并按顺序保存它,以便我可以按相同顺序读取它,将其保存到矢量结构中。再一次,我想避免这种情况,但是如果你能在这里帮助我,你是否愿意听取你的意见。
如果你需要它,这是我的结构:
const int NAME_SIZE = 51, ADDR_SIZE = 51, PHONE_SIZE = 14;
struct Client
{
char name[NAME_SIZE];
char address1[ADDR_SIZE];
char address2[ADDR_SIZE];
char phone[PHONE_SIZE];
double acctBal;
double lastPay;
};
答案 0 :(得分:2)
您的输出文件看起来像是因为您正在执行Client结构的原始转储。因此,将为名称写入51个字节,为address1写入51个字节等。无论字符串长度如何。
您需要单独正确地编写每个字段。
customer << input.name << endl;
customer << input.address1 << endl;
等.....
答案 1 :(得分:0)
cout << endl << "Street Adress (And Apartment Number):" << endl;
cin >> person.address1;
getline(cin, input);
strcpy(person.address1, input.c_str());
如果您提到211
并将其放入address1
,那么您将收到第一个令牌,然后获取该行的其余部分并用address1
替换211
中的内容。这就是你std::string
去了的地方。
如果你的意图是将整个结构写成/读取像这样的二进制blob,你应该以二进制模式打开文件。如果要将数据存储为文本使用strcpy
,请避免{{1}}混乱,并在每个成员上单独写/读。