奇怪的文本文件输出和写作问题

时间:2014-03-08 04:52:09

标签: c++ file text-files output

在我的代码中:

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;
};

2 个答案:

答案 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}}混乱,并在每个成员上单独写/读。