Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 文件设置正确,但eof()和peek()意外地从新流返回错误的值_C++_Fstream_Iostream - Fatal编程技术网

C++ 文件设置正确,但eof()和peek()意外地从新流返回错误的值

C++ 文件设置正确,但eof()和peek()意外地从新流返回错误的值,c++,fstream,iostream,C++,Fstream,Iostream,我想生成一个随机数组 void Random_nums(int n, string fileName) { ofstream fsave(fileName); int ranArray[n]; srand( (unsigned int)time(NULL) ); for(int i=0; i<n; i++) { ranArray[i]=rand()%2001 - 1000; fsave << ranAr

我想生成一个随机数组

void Random_nums(int n, string fileName) {

    ofstream fsave(fileName);
    int ranArray[n];

    srand( (unsigned int)time(NULL) );
    for(int i=0; i<n; i++)
    {
        ranArray[i]=rand()%2001 - 1000;
        fsave << ranArray[i] << '\n'; //save them into ranArray
    }

    fsave.close();
}
我还提供了一些其他测试,例如,当我生成随机数时,将fsave.eof()放在循环中,它会打印出所有0

有人能告诉我这里发生了什么事吗?我现在完全没有线索。

使用
std::distance(istream\u iterator(fin),istream\u iterator())
遍历文件,直到它无法读取和
int
。这可能是因为有一些输入无法解析为
int
(跳过前导空格后)或到达文件末尾。在任何情况下,当对
distance()
的调用返回时,流将设置
std::ios\u base::failbit
并且如果错误是由于到达文件结尾而导致的,则流也将设置
std::ios\u base::failbit

显而易见的解决办法是不确定距离,而是直接将整数读入合适的表示形式。例如:

std::vector<int> array{std::istream_iterator<int>(fin),
                       std::istream_iterator<int>()};
当您确实觉得需要首先确定元素的数量时,您需要

  • clear()
    获取
    std::ios\u base::failbit
    设置后的流状态。没有这一点,大多数流操作将被忽略
  • seekg()
    返回到流的开头
  • 但是,请注意,调整std::vector的大小几次几乎肯定比读取文件并分析其内容两次更有效

    顺便说一句,使用数组有两个问题:

  • 可变大小的数组是“强>不<强”>标准C++的一部分,虽然有些编译器支持它们作为扩展。
  • 如果文件大小合理,则会出现堆栈溢出

  • 您最好改用
    std::vector

    istream::eof()
    返回一个
    bool
    。打印时,
    bool
    仅具有值
    0
    1
    EOF
    是C中的一个宏,通常扩展为
    int
    文本,并且可能有一个超出正常字符范围的值-因此不能是
    0
    1
    。因此,
    EOF
    fin.EOF()
    不能比较相等<代码>鳍。PEEK():(代码用于股票标准流)返回<代码> STD::CHARYMULTS(CHAR>:EOF)(代码)>简短的解决方案:避免使用C宏(如<代码> EOF >)对C++流的测试状态。非常感谢!只需修复它!
    -1 -1-1
    1
    
    Process finished with exit code 0
    
    std::vector<int> array{std::istream_iterator<int>(fin),
                           std::istream_iterator<int>()};
    
    for (int tmp; fin >> tmp; ) {
        // use tmp
    }