c++ .eof()循环不工作

ymdaylpp  于 2023-10-20  发布在  其他
关注(0)|答案(3)|浏览(121)

我正试着从一个文件中读入数字并把它们放入一个数组中。现在,当我运行程序时,它会打印8个数字,然后该行结束并打印相同的8个数字。这是一个永无止境的循环。我做错了什么?

#include <iostream>                                                             
#include <fstream>                                                              
using namespace std;                                                            

int main()                                                                      
{                                                                               
  int num;                                                                      
  ifstream infile;                                                              
  infile.open("euler8Nums.txt");                                                
    infile >> num;//must attempt to read info prior to an eof() test            
    while(!infile.eof()){                                                       
      cout << num << endl;                                                      
      infile >> num;                                                            
    }                                                                           
    infile.close();                                                             
    return 0;                                                                   
}
cotxawn7

cotxawn71#

一般情况下,不要使用.eof().bad()。只需检查流本身的状态

while (infile >> num)
    cout << num << endl;

如果流未能解析输入,则不会设置eof标志,然后流将停止操作,直到状态被清除。如果你检查bad,它会一直运行到解析失败,但会在解析失败时出错。因此,只需检查流是否仍然是.good()(当它处于while循环中时,这是隐式的)。
在你的例子中,这是一个无限循环,因为文件 * 没有打开 *,然后你试图读取数字,但是阅读没有做任何事情 *,因为文件没有打开。因此,它永远不会读取eof,因此无限循环。

eoxn13cs

eoxn13cs2#

我不知道你的文件包含什么,也不知道它是如何导致无限循环打印比最后一个数字多的。但是,eof()位仅适用于错误报告,而not位适用于环路控制。此外,代码中还有很多其他的东西是完全不必要的。下面的程序应该可以读取数字:

#include <iostream>                                                             
#include <fstream>                                                              

int main()                                                                      
{                                                                               
    std::ifstream infile("euler8Nums.txt");
    for (int num; infile >> num; )
        std::cout << num << "\n";
    return 0;
}

我从来不认为单独调用open()有什么意义,除非在确定文件名之前有一个必要的条件。类似地,显式调用close()似乎毫无意义,除非您想检查关闭是否成功(尽管我不确定输入流上的close()是否有机会失败)。
我的另一个讨厌的事情是不必要地使用std::endl:这种操纵器是一个相对频繁的不良性能的来源!它做两件事:
1.它写一个行尾字符,即。\n(或者,在宽字符流上,是加宽此字符的结果)。
1.它能冲垮小溪。在文件流上,这是一个相当昂贵的操作,很容易会降低速度(不仅仅是几个百分点)。实际的写操作通常会影响将数据写入文件的代码的实际实时性能。
只有当你真的想冲的时候才冲。如果你觉得你需要额外的冲洗你的流,例如。当试图查找崩溃前写的内容时,只需在stream对象上设置std::unitbuf:从性能的观点来看,这将是更差的,因为它在每次插入之后刷新流,但是一旦问题被定位,它就容易被移除。
当然,生成的程序可以更改为更简洁的程序,例如

#include <iostream>
#include <fstream>
#include <algorithm>
#include <iterator>

int main()
{
    std::copy(std::istream_iterator<int>(std::ifstream("euler8Nums.txt") >> std::ws),
              std::istream_iterator<int>(), std::ostream_iterator<int>(std::cout, "\n"));
}
ubof19bj

ubof19bj3#

#include <fstream>

include #包含

using namespace std;

int main()
{
    char r,g,b;
    char temp1 = '0';
    int i = 0;
    
    ifstream infile;    
    ofstream out_r,out_g,out_b;
    infile.open("D:\\data.dat", ios::in | ios::binary);
    out_r.open("D:\\red.dat",ios::out | ios::binary);
    out_g.open("D:\\green.dat",ios::out | ios::binary);
    out_b.open("D:\\blue.dat",ios::out | ios::binary);  
    
    if(infile.fail()) {
        cout << "failed to open";
    } else
    int start = infile.tellg();
    infile.seekg(-0, ios::end);
    int end = infile.tellg();
    //cout << infile.tellg() << endl;
    infile.seekg(0, ios::beg);
    
    for(i=0; !infile.eof(); i++)
    {                                                          
        int poi = infile.tellg();
        if( poi == end)
        {
        return 1;           
        } else
        infile.get(r);
        out_r << r;
        infile.get(g);
        out_g << g;
        infile.get(b);
        out_b << b;
        
    }infile.close();
    out_r.close();
    out_g.close();
    out_b.close();
    return 0;
}

相关问题