C ++ fstream通过.text搜索结构

时间:2015-04-01 20:23:56

标签: c++ struct fstream

我有一个程序,允许用户输入新记录(放入结构然后写入文件),打印所有记录或编辑特定记录。我已经包含了我的功能。记录是针对girlscout cookie信息。它有名称,数量,价格和成本。它打开文件要求用户输入名称,然后当它找到该名称时,它将所有数据读入临时结构变量(与写入文件的内容相同),用户可以在其中更改数量和在它读取的同一个地方重写它。除了更新的数量之外,一切都应该是相同的。它完成所有这些但是由于某种原因将之前的所有其他记录变为null或0。我的错误是什么让我改变了文件中的所有其他记录。我只是想编辑这个特定的。  这只是功能。真的很感激帮助!

功能代码:

void editField()
{
    char input[20];
    fstream data("cookies.txt", ios::in);
    cookies test;

    if ( !data ) {
        cout << "Error opening file. Program aborting.\n";
        return;
    }

    cout << "Please enter the name of the cookie you are searching for: ";
    cin.getline(input,20);

    data.read(reinterpret_cast<char *>(&test),
    sizeof(test));

    while (!data.eof())
    {
        if( strcmp(input,test.name) == 0 ) {

            int position = data.tellp();
            data.close();
            data.clear();
            data.open("cookies.txt", ios::binary | ios::out);

            cout << "Please enter the new quantity for the cookie ";
            cin >> test.quantity;

            data.seekp(position-sizeof(test),ios::cur);
            data.write(reinterpret_cast<char *>(&test), sizeof(test));
        }
        // Read the next record from the file.
        data.read(reinterpret_cast<char *>(&test),
        sizeof(test));
    }
    return;
}

1 个答案:

答案 0 :(得分:0)

  • while(!data.eof())更改为while(data)
  • 为清楚起见,请在while循环的开头读取文件中的记录,而不是在结尾处。
  • 写完记录后,您可以摆脱循环。
  • 编写cookies.txt时,请使用std::ios::binary | std::ios::in | std::ios::out打开它。寻求std::ios::beg
  • 您可以同时打开文件进行读写。这应该有效,但是没有必要。在写入之前关闭文件以供阅读。