#include <fstream>
int main()
{
char c = 0;
std::ifstream file("test.txt");
if (!file){
std::cout << "error"<<std::endl;
return 1;
}
while (!file.eof()){
file.get(c);
std::cout << c ;
}
system("pause");
return 0;
}
如果test.txt的内容是:123456,那么输出的结果将会是:1234566。
如果数据:123456 后面还有一个空行,就不会显示重复(也许重复了一个空行,但是我们看不到)。
后来通过 Google ,发现 eof() 返回true的条件是“读到文件结束符”,而不是文件内容的最后一个字符。
要清楚“文件结束符”(0xff),就是说我们文件最后的字符不是文件结束符,而最后的字符的下一位才是。所以操作再读多一次。在一些编译器中(dev c++),它读到最后一个字符后文件位置的指针会定在那儿,所以就会重复最后一个字符。
#include <fstream>
int main()
{
char c = 0;
std::ifstream file("test.txt");
if (!file){
std::cout << "error"<<std::endl;
return 1;
}
while (file.peek() != EOF){ // 修改了这里,判断条件为:file.peek() != EOF
file.get(c);
std::cout << c ;
}
system("pause");
return 0;
}
peek()是取文件当前指针,EOF是文件尾标符,它的值为-1,所以采用这种方法就解决上面eof()的问题了。这种方法也可以用在读写二进制文件中。
本文探讨了使用C++从文本文件中读取数据时遇到的一个常见问题:如何避免重复输出文件末尾的字符。通过对比eof()和peek()两种方法,解释了它们的工作原理,并给出了解决方案。
1918

被折叠的 条评论
为什么被折叠?



