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
。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
}