我正在尝试写一个模拟书店程序。该程序用于从一个输入文件中读取数据并将其写入一个输出文件。我有几个限制。我只能使用一个输入文件和一个输出文件。我必须使用两个for循环。一个用于文件中列出的五个客户,另一个用于他们将要购买的每本书,最多可能有5本书。
第一个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 for the output。
示例输入文件
user name
address
number of books
book1
price1
book2
user name2
address
number of books
book2.1
price2.1
等。实际上有更多的信息。任何帮助将不胜感激。对不起,对于新问题。我在发布之前进行了搜索和搜索。
答案 0 :(得分:3)
每次循环时都不要打开和关闭它。在外循环之前打开一次,在同一循环之后关闭一次。
当您打开文件时,读/写位置通常设置为文件的开头(ios :: app是您已经发现的例外)。
答案 1 :(得分:1)
您的<<
和>>
符号的轮次错误。
为UserInformation和BookInformation创建一个struct(或类),然后创建这些重载:
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..
}