C++ 使用ifstream.getline()
C++ 通过以下几个类支持文件的输入输出:
ofstream: 写操作(输出)的文件类 (由ostream引申而来)
ifstream: 读操作(输入)的文件类(由istream引申而来)
fstream: 可同时读写操作的文件类 (由iostream引申而来)
所有的I/O都以这个“流”类为基础的。
下文对ifstream.getline()的用法进行了总结1。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 | #include <iostream> #include <fstream> #include <string> using namespace std; //输出空行 void OutPutAnEmptyLine() { cout<<"\n"; } //读取方式: 逐词读取, 词之间用空格区分 //read data from the file, Word By Word //when used in this manner, we'll get space-delimited bits of text from the file //but all of the whitespace that separated words (including newlines) was lost. void ReadDataFromFileWBW() { ifstream fin("data.txt"); string s; // c++的流析取器 >> 从流对象析取内容到右操作数。 //它的默认分隔符(用以判断某次析取内容边界的字符)是:\t,space,enter. while( fin >> s ) { cout << "Read from file: " << s << endl; } } //读取方式: 逐行读取, 将行读入字符数组, 行之间用回车换行区分 //If we were interested in preserving whitespace, //we could read the file in Line-By-Line using the I/O getline() function. void ReadDataFromFileLBLIntoCharArray() { ifstream fin("data.txt"); const int LINE_LENGTH = 100; //一:fstream.getline的第二个参数需要传入字符数,而非字节数,文档中没有明确说明。 //二:如果单行超过了缓冲,则循环会结束。 //总结:用getline的时候,一定要保证缓冲区够大,能够容纳各种可能的数据行。切记传入字符数。 //在此例中则为创建"data.txt"的时候,每一行的字符数不要超过100,否则while循环会结束。 char str[LINE_LENGTH]; while( fin.getline(str,LINE_LENGTH) ) { cout << "Read from file: " << str << endl; } } //读取方式: 逐行读取, 将行读入字符串, 行之间用回车换行区分 //If you want to avoid reading into character arrays, //you can use the C++ string getline() function to read lines into strings void ReadDataFromFileLBLIntoString() { ifstream fin("data.txt"); string s; while( getline(fin,s) ) { cout << "Read from file: " << s << endl; } } /* 待探究 使用方法 //带错误检测的读取方式 //Simply evaluating an I/O object in a boolean context will return false //if any errors have occurred void ReadDataWithErrChecking() { string filename = "dataFUNNY.txt"; ifstream fin( filename.c_str()); if( !fin ) { cout << "Error opening " << filename << " for input" << endl; exit(-1); } } */ int main() { ReadDataFromFileWBW(); //逐词读入字符串 OutPutAnEmptyLine(); //输出空行 ReadDataFromFileLBLIntoCharArray(); //逐词读入字符数组 OutPutAnEmptyLine(); //输出空行 ReadDataFromFileLBLIntoString(); //逐词读入字符串 OutPutAnEmptyLine(); //输出空行 ReadDataWithErrChecking(); //带检测的读取 return 0; } |
c++的流析取器 >> 从流对象析取内容到右操作数。它的默认分隔符(用以判断某次析取内容边界的字符)是:\t,space,enter.。2
两个说明,一是fstream.getline的第二个参数需要传入字符数,而非字节数,文档中没有明确说明,俺在这里栽过。二是,如果单行超过了缓冲,则循环会结束,因为f.good()返回false。
总结:用getline的时候,一定要保证缓冲区够大,能够容纳各种可能的数据行。切记传入字符数。。3
参考资料
-
C++ 使用ifstream和getline读取文件内容 ??
-
关于c++流析取器>>的分隔符 ??
-
hfstream.getline的坑 ??