C++ 使用ifstream.getline()读取文件内容

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

参考资料


  1. C++ 使用ifstream和getline读取文件内容 ??

  2. 关于c++流析取器>>的分隔符 ??

  3. hfstream.getline的坑 ??