gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:12:30 26 4
gpt4 key购买 nike

我想生成一个随机数组。

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();
}

我想将它们保存到一个单独的文件中。

之后我想读取刚刚保存的数据并在新函数中实现它们。

void FunctionWantToUse(string inputFile, string outputFile) {

//reading data
ifstream fin(inputFile);
cout << fin.is_open();//which is 1

//how many numbers are there in this file
int n = 0;
n = distance(istream_iterator<int>(fin), istream_iterator<int>());

//restore the array
int array[n];

//test
cout << fin.peek() << ' ' << EOF;//they are both -1!

//another test
cout << fin.peek() << '\n'; //which return -1
cout << fin.eof() << '\n'; //which return 1

//since peek() and EOF both return -1, I can't get into this loop.
while (fin.peek() != EOF) {
if ((fin >> array[i]).good()) {
cout << array[i];
}
}

完全不知道为什么 fin.peek() 和 fin.eof() 的值分别变为 -1 和 1。

当我运行这两个函数时,控制台告诉我这一点。

-1 -1-1
1

Process finished with exit code 0

我还给出了一些其他的测试,比如,当我生成随机数时,将 fsave.eof() 放在循环中,它打印出全 0。

有人能告诉我这是怎么回事吗?我现在完全不知道。

最佳答案

std::distance(istream_iterator<int>(fin), istream_iterator<int>())你遍历文件直到它无法读取并且 int .发生这种情况是因为有些输入无法解析为 int (跳过前导空格后)或到达文件末尾。无论如何,当调用 distance()返回流将有 std::ios_base::failbit设置,如果错误是由于文件末尾也到达 std::ios_base::failbit .

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

std::vector<int> array{std::istream_iterator<int>(fin),
std::istream_iterator<int>()};

如果您真的想改用循环,您应该测试流在之后从流中读取是否处于失败状态,例如:

for (int tmp; fin >> tmp; ) {
// use tmp
}

当您真的觉得需要先确定元素的数量时,您需要

  1. clear()获得 std::ios_base::failbit 后的流状态放。否则,大多数流操作将被忽略。
  2. seekg()回到流的开始。

但是请注意,调整 std::vector<int> 的大小几次几乎肯定比通读一个文件并解析其内容两次更有效。

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

  1. 可变大小数组不是标准 C++ 的一部分,尽管一些编译器确实支持它们作为扩展。
  2. 如果文件大小合理,您将遇到堆栈溢出。

你最好使用 std::vector<int>相反。

关于c++ - 文件设置正确,但 eof() 和 peek() 意外从新流返回错误值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47156731/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com