【问题标题】:reading input from middle of a file c++ using for loops使用for循环从文件c ++中间读取输入
【发布时间】:2012-10-23 11:25:18
【问题描述】:

我正在尝试编写一个模拟书店程序。该程序是从一个输入文件中读取数据并将其写入一个输出文件。我有几个限制。我只能使用一个输入文件和一个输出文件。我必须使用两个 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

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

【问题讨论】:

    标签: c++ file-io input output


    【解决方案1】:

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

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

    【讨论】:

    • 我将 fin.open(input.txt) 和 fout.open(output.txt) 移到外部 for 循环之外,现在它只在第一个循环内部进行读取
    • 你好。再次回来。道歉。有效。我还有一个 fout.open 的残留物,我还没有删除。老实说,这就是我一开始会采取的方式,但要引用说明:“外部 FOR 循环将为每个客户重复。内部 FOR 循环将为外部循环客户购买的每本书重复。因为数据不是在循环外可用,在循环内打开和关闭每个文件。”
    • @user1768079 指令对我来说听起来很垃圾。
    • 同意。再次感谢。我不确定如何将其设置为关闭,但这回答了我的问题。
    【解决方案2】:

    你的&lt;&lt;&gt;&gt; 符号弄错了。

    为 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..
    }
    

    【讨论】:

    • 他只是在伪代码中犯了一个错误。这不是问题所在。
    • 抱歉,现在是早上 6:38。我整晚都在努力完成这件事。实际代码比这要长得多。这只是唯一无法正常运行的部分
    • 嗯,最有可能的错误是在循环期间多次打开文件
    猜你喜欢
    • 2017-10-12
    • 2016-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-09
    • 1970-01-01
    • 1970-01-01
    • 2016-10-02
    相关资源
    最近更新 更多