ifstream note

本文详细解析了C++中fstream类的操作,包括未初始化对象的行为、多次关闭文件的影响、读取状态以及如何处理文件EOF状态。通过实例演示了如何正确地使用getline函数并重设读写位置。

-------------------------20100804-------------------------------------------

3 fstream对象未初始化时, 使用if()判断时, 返回true;

ifstream ff;

cout << int(bool(ff)); //将会输出1

 

4 close多次调用, 最终含义不一样: windows上打开的文件被关闭多次后, fstream对象将不能再次使用; cent os上可以

ifstream ff;

ff.open("2.txt");

ff.close();

ff.close();

ff.open("2.txt");

cout << int(ff.is_open() && ff.good());

 

最后一条语句在windows上将会输出0, 在cent os上将会输出1。

 

5 未初始化的fstream对象被认为是好的, 只不过一被读取就到达eof了;

读取一个不存在的文件后,fstream对象的状态就为false(bad)了

 

----------------------------------------------------------------------------------

1 读取status

ifstream f1("filename");

 

char buf[max];

while(f1.getline(buf, max))

{

    //do something

}

 

假设文件有3行, while循环体执行几次? getline执行几次?

答: while循环体内执行3次, 但是getline成功执行4次。

因为, 当getline成功执行第3次后,文件的状态还是有效的; 再次执行getline时,buf被置空且f1的status被设置为eof.

最好使用此种标准的写法, 程序会更简洁不易错

 

 

2 当文件已经是eof时, seekg函数将不起任何作用, 此时tellg返回-1。 如果需要重设读写位置, 必需首先调用 f1.clear(),该函数将清除文件的状态

f1.clear();

f1.seekg(10, ios::beg|cur|end);

 

49725@DESKTOP-CB4LRLP /cygdrive/f/S $ g++ -mwindows screensaver_clock.cpp -o screensaver_ -lcomctl32 -lgdi32 -luser32 screensaver_clock.cpp: In function 'void LoadLearningTime()': screensaver_clock.cpp:36:32: error: no matching function for call to 'std::basic_ifstream<char>::basic_ifstream(const wchar_t*&)' std::ifstream file(LOG_FILE); ^ In file included from screensaver_clock.cpp:5: D:/wingcc/mingw64/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/fstream:554:7: note: candidate: 'std::basic_ifstream<_CharT, _Traits>::basic_ifstream(std::basic_ifstream<_CharT, _Traits>&&) [with _CharT = char; _Traits = std::char_traits<char>]' basic_ifstream(basic_ifstream&& __rhs) ^~~~~~~~~~~~~~ D:/wingcc/mingw64/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/fstream:554:7: note: no known conversion for argument 1 from 'const wchar_t*' to 'std::basic_ifstream<char>&&' D:/wingcc/mingw64/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/fstream:529:7: note: candidate: 'std::basic_ifstream<_CharT, _Traits>::basic_ifstream(const string&, std::ios_base::openmode) [with _CharT = char; _Traits = std::char_traits<char>; std::__cxx11::string = std::__cxx11::basic_string<char>; std::ios_base::openmode = std::_Ios_Openmode]' basic_ifstream(const std::string& __s, ^~~~~~~~~~~~~~ D:/wingcc/mingw64/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/fstream:529:7: note: no known conversion for argument 1 from 'const wchar_t*' to 'const string&' {aka 'const std::__cxx11::basic_string<char>&'} D:/wingcc/mingw64/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/fstream:513:7: note: candidate: 'std::basic_ifstream<_CharT, _Traits>::basic_ifstream(const char*, std::ios_base::openmode) [with _CharT = char; _Traits = std::char_traits<char>; std::ios_base::openmode = std::_Ios_Openmode]' basic_ifstream(const char* __s, ios_base::openmode __mode = ios_base::in) ^~~~~~~~~~~~~~ D:/wingcc/mingw64/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/fstream:513:7: note: no known conversion for argument 1 from 'const wchar_t*' to 'const char*' D:/wingcc/mingw64/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/fstream:502:7: note: candidate: 'std::basic_ifstream<_CharT, _Traits>::basic_ifstream() [with _CharT = char; _Traits = std::char_traits<char>]' basic_ifstream() : __istream_type(), _M_filebuf() ^~~~~~~~~~~~~~ D:/wingcc/mingw64/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/fstream:502:7: note: candidate expects 0 arguments, 1 provided screensaver_clock.cpp: In function 'void SaveLearningTime()': screensaver_clock.cpp:53:32: error: no matching function for call to 'std::basic_ofstream<char>::basic_ofstream(const wchar_t*&)' std::ofstream file(LOG_FILE); ^ In file included from screensaver_clock.cpp:5: D:/wingcc/mingw64/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/fstream:780:7: note: candidate: 'std::basic_ofstream<_CharT, _Traits>::basic_ofstream(std::basic_ofstream<_CharT, _Traits>&&) [with _CharT = char; _Traits = std::char_traits<char>]' basic_ofstream(basic_ofstream&& _优化代码,全代码输出
05-13
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值