C++的ifstream中使用eof最后一个字符输出两次,其实不是eof的锅!

写C++文件输入输出流时遇到的小问题

当我执行以下代码时,最后的值会打印两次:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
#include <stdlib.h>
#include <fstream>
using namespace std;

int main(void)
{
int a = 0,b = 1,c = 2,d = 3;
char ch;
ofstream FileOpen("Test.txt");
FileOpen<<"HelloWorld!\n";
FileOpen<<a<<b<<c<<d;
FileOpen.close();
ifstream Filein("Test.txt");
while(!Filein.eof())
{
Filein.get(ch);
cout<<ch;
}
Filein.close();
cout<<endl;
system("pause");
return 0;
}

问题在于get()方法:get()方法返回当前文件“内置指针”指向的下一个字符,然后再将“内置指针”向后移动。

也就是说“内置指针”是在执行完get()后才指向下一个字符。

下面来分析一下波:

当“内置指针”指向c时,get()返回d的值给ch,然后“内置指针”向后移动指向d,打印d的值,此时eof()返回false,而循环继续进行;

再次get(),当前“内置指针”指向d,返回的是d后面的值,然而d后面是EOF,读取失败,无法赋值给ch,ch依然为d的值,再次打印了一次d的值,get()完后,“内置指针”指向了EOF,eof()返回true,则退出而循环。

结束。

原理已经懂了,进行以下的改造即可输出正确:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <stdlib.h>
#include <fstream>
using namespace std;

int main(void)
{
int a = 0,b = 1,c = 2,d = 3;
char ch;
ofstream FileOpen(“Test.txt”);
FileOpen << "Helloworld!\n";
FileOpen << a << b << c << d;
FileOpen.close();
ifstream Filein("Test.txt");
if(Filein.get(ch),!Filein.eof())
{
cout << ch;
}
cout << endl;
system("pause");
return 0;
}

Copyright © 2018 - 2019 Jaxes的博客 All Rights Reserved.

访客数 : | 访问量 :