2

我正在尝试编写一个模拟书店程序。该程序是从一个输入文件中读取数据并将其写入一个输出文件。我有几个限制。我只能使用一个输入文件和一个输出文件。我必须使用两个 for 循环。文件中列出的五位客户每人一本,他们将要购买的每一本书都有一本,最多可能有 5 本书。

第一个 for 循环输入客户信息和要购买的书籍数量(因此下一个 for 循环将知道要迭代多少次)。第二个循环获取有关书籍的信息。

问题:我知道如何防止输出文件覆盖自身,但是如何让输入文件从循环的最后一次迭代停止的地方读取。

出于某种原因,当我尝试发布我的代码时,它正在重新格式化它,并添加不应该存在的字符。但这里是我想要做的伪代码。

for(count=1; count<=5; count++)
   {
   fin.open("input.txt");
   fin << user information(including name, address and number of books)
   fout.open("output.txt" ios::app);
   fout >> user information

   for(count1=1; count1<=numbbooks; count1++)
      {
      fin << book information(Name, Author, Price)
      fout >> book information
      }

我知道如何使用 getline、fin 来接收数据,但是在每个循环的第一次迭代之后,它开始从文件的开头读取。我需要它从上一次迭代完成的地方读取。我了解 ios:app 的输出。

样本输入文件

user name
address
number of books
book1
price1
book2
user name2
address
number of books
book2.1
price2.1

等等。实际上还有比这更多的信息。任何帮助将不胜感激。对不起,新手的问题。我在这里发帖之前搜索和搜索。

4

2 回答 2

3

简单不要每次循环打开和关闭它。在外循环之前打开一次,在同一个循环之后关闭一次。

当您打开文件时,读/写位置通常设置为文件的开头(您已经发现 ios::app 是一个例外)。

于 2012-10-23T11:28:01.863 回答
1

你有你的<<>>符号错误的方式。

为 UserInformation 和 BookInformation 创建一个结构(或类),然后创建这些重载:

std::ostream& operator<<( std::ostream& os, const UserInformation& );
std::istream& operator>>( std::istream& is, UserInformation& );
std::ostream& operator<<( std::ostream& os, const BookInformation& );
std::istream& operator>>( std::istream& is, BookInformation& );

其中每一个都将读取或写入您的结构成员。

在您的外部循环中,您也应该只读取/写入,而不是打开文件,因此将它们移到循环之外:

fin.open("input.txt");         
fout.open("output.txt" ios::app);      

// verify both fin and fout worked correctly then
UserInformation userInfo;
while( fin >> userInfo ) // or use a count if you only want to read a limited number
{
     // continue with reading books and outputting..
}
于 2012-10-23T11:27:47.080 回答