C++ ifstream 类
示例
使用 ifstream
从文件中读取行
// Create a text string, which is used to output the text file
string myText;
// Read from the text file
ifstream MyReadFile("filename.txt");
// Use a while loop together with the getline() function to read the file line by line
while (getline (MyReadFile, myText)) {
// Output the text from the file
cout << myText;
}
// Close the file
MyReadFile.close();
定义和用法
The ifstream
类(缩写为“输入文件流”)用于从文件中读取数据。
The ifstream
类定义在 <fstream>
头文件中。
要打开文件,请将文件路径传递给构造函数。
ifstream MyReadFile("filename.txt");
The ifstream
类有许多方法可以从文件中读取数据。一种简单的方法是使用 getline()
函数读取直到下一个换行符的所有字符,并将它们写入字符串中。
从文件中输出一行文本
string myText;
getline(MyReadFile, myText);
cout << myText;
文件读取函数
文件读取函数从文件中提取字符并移动文件指针。
get()
The get()
方法从文件中读取一个字符,并将其 ASCII 值作为 int
值返回。将其转换为 char
类型以查看字符。文件指针移至文件中的下一个字符。
char myChar = MyReadFile.get();
cout << myChar;
The get(destination, size, delimiter)
方法将从文件中读取的数据写入到目标位置,最多写入 size 个字符。它在到达换行符、文件末尾或由 delimiter 参数给出的可选字符时停止读取。写入 destination 的值总是以 \0
空字符结尾。此方法将文件指针移至它停止读取的换行符或分隔符。
char destination[20];
MyReadFile.get(destination, 20);
cout << destination << "\n";
// Stop reading when a '.' is found
MyReadFile.get(destination, 20, '.');
cout << destination << "\n";
getline()
The getline(destination, size, delimiter)
方法与 get(destination, size, delimiter)
方法相同,只是换行符或分隔符被丢弃,文件指针被移至其后的字符。
char destination[20];
MyReadFile.getline(destination, 20);
cout << destination << "\n";
// Stop reading when a '.' is found
MyReadFile.getline(destination, 20, '.');
cout << destination << "\n";
还有一个类似的 getline(stream, destination, delimiter)
**函数**,它读取从 stream 参数中的 ifstream
对象指定的文件中读取直到下一个换行符(或可选的 delimiter)的所有字符,并将它们写入 destination 指定的字符串中。
string destination;
getline(MyFile, destination);
cout << destination << "\n";
// Stop reading when a '.' is found
getline(MyFile, destination, '.');
cout << destination << "\n";
read()
The read(destination, n)
方法从文件中读取 n 个字符,并将它们写入由 destination 参数指定的 char
数组中。与其他函数不同,它不会在换行符处停止读取,也不会在数据中添加空字符。
char destination[20];
MyReadFile.read(destination, 19);
destination[20] = '\0'; // Make sure it ends with a null terminating character
cout << destination << "\n";
peek()
The peek()
方法从文件中读取一个字符,并将其 ASCII 值作为 int
值返回。将其转换为 char
类型以查看字符。与 get()
方法不同,此方法不会移动文件指针。
char myChar = MyReadFile.peek();
cout << myChar;
gcount()
The gcount()
方法返回最近调用过的文件读取方法从文件中提取的字符数。
char destination[20];
MyReadFile.getline(destination, 20);
cout << MyReadFile.gcount() << "\n";
文件处理函数
文件处理函数打开、关闭和导航文件。
open()
The open(filepath)
方法打开 filepath 指定路径的文件。如果文件已打开,则此方法不会有任何效果。
ifstream MyReadFile;
MyReadFile.open("filename.txt");
is_open()
The is_open()
方法在文件打开时返回 true,在没有打开文件时返回 false。
ifstream MyReadFile;
cout << MyReadFile.is_open(); << "\n"; // Displays 0 because the file is not open
MyReadFile.open("filename.txt");
cout << MyReadFile.is_open(); << "\n"; // Displays 1 because the file is open
close()
The close()
方法关闭文件。在完成文件操作后关闭文件以释放资源是一个好习惯。
MyReadFile.close();
rdbuf()
The rdbuf()
方法返回指向内部 filebuf
对象的指针,该对象直接处理文件。
filebuf * buf = MyReadFile.rdbuf();
unget()
The unget()
方法将文件指针向后移动一个字符。
使用 unget()
方法打印同一个字符两次
char myChar = MyReadFile.get();
cout << myChar << "\n";
MyReadFile.unget();
myChar = MyReadFile.get();
cout << myChar;
seekg()
The seekg(position)
方法将文件指针移动到相对于文件开头指定的位置。
MyReadFile.seekg(6)
The seekg(position, origin)
方法将文件指针移动到相对于origin指定的文件中的位置。origin 有三个可能的值
ifstream::beg
- 位置相对于文件的开头。ifstream::cur
- 位置相对于当前文件位置。ifstream::end
- 位置相对于文件的结尾。
将文件指针移动到不同的位置
MyReadFile.seekg(6, ifstream::beg);
cout << MyReadFile.tellg(); << "\n";
MyReadFile.seekg(-3, ifstream::cur);
cout << MyReadFile.tellg(); << "\n";
MyReadFile.seekg(-4, ifstream::end);
cout << MyReadFile.tellg(); << "\n";
tellg()
The tellg()
方法返回文件指针在文件中的当前位置。
cout << MyReadFile.tellg();
提取运算符
The >>
提取运算符从文件中的当前位置读取一定数量的字符,解释它们并将解释后的值写入变量。然后文件指针移动到尚未读取的下一个字符。字符的解释方式取决于变量的数据类型。
语法
MyReadFile >> variable
它也可以多次使用来依次读取文件的各个部分。
MyReadFile >> variable1 >> variable2 >> variable3
The >>
提取运算符首先跳过空白字符(空格、制表符和换行符),直到遇到第一个不是空白字符的字符。之后,它将根据变量的数据类型遵循下表中所示的规则。
数据类型 | 描述 | 例子 |
---|---|---|
int long short
|
读取一系列数字并将其解释为整数。该序列可以以符号(“+”或“ -”)开头。它在遇到第一个不是数字的字符时停止读取。 如果未找到有效的序列, ifstream 对象将失败并停止进一步读取。 |
15 |
bool |
以与上述相同的方式读取整数,然后将 0 解释为false,将 1 解释为true。任何其他整数值都将解释为true,但ifstream 对象将失败并停止进一步读取。下一节中描述的 boolalpha 操纵器将完全改变这种行为。 |
0 |
float double
|
读取有效的字符序列并将其解释为浮点数。有效序列至少包含一位数字,可以以符号(“+”或“ -”)开头,可以后跟小数点和小数位。科学记数法(一个数字后跟“e”或“E”以及一些数字)也可以使用。 如果未找到有效的序列, ifstream 对象将失败并停止进一步读取。 |
5 |
char
|
从文件读取单个字符。 如果文件指针位于文件的末尾, ifstream 对象将失败并停止进一步读取。 |
B |
string char *
|
读取所有字符,直到遇到下一个空白字符(空格、制表符或换行符)、空终止符或文件末尾。该变量将添加一个\0 空终止符到值。如果文件指针已经位于空终止符处或文件的末尾, ifstream 对象将失败并停止进一步读取。 |
Hello |
操纵器
操纵器可以用来代替变量。当使用操纵器时,它们会改变ifstream
对象如何解释数据。操纵器的效果会一直持续,直到另一个操纵器改变它为止。
下表列出了ifstream
对象可以使用的操纵器列表。
操纵器 | 描述 |
---|---|
noskipws |
The >> 提取运算符将读取空白字符,而不是跳过它们。这主要对char 类型变量有用,因为对于其他数据类型,它在遇到空白字符时会停止读取。 |
skipws |
重置noskipws 操纵器所做的更改。 |
ws |
将文件指针移动到文件中没有空白字符的下一个位置。 |
hex |
使用整数变量时,期望数字的十六进制表示形式(数字 0 到 9 以及 A 到 F)。 |
oct |
使用整数变量时,期望数字的八进制表示形式(数字 0 到 7)。 |
dec |
使用整数变量时,期望数字的十进制表示形式(数字 0 到 9)。这将重置hex 和oct 操纵器所做的更改。 |
boolalpha |
读取布尔变量的数据时,它会寻找字符序列“true”或“false”,而不是寻找整数。 |
noboolalpha |
重置boolalpha 操纵器所做的更改。 |
示例
使用操纵器来改变数据解释方式
bool myBool;
int myInt;
// Interpret character sequences "true" and "false" as boolean values
MyFile >> boolalpha >> myBool;
// Revert to reading booleans normally
MyFile >> noboolalpha;
// Read hexadecimal numbers from the file and interpret them as integers
MyFile >> hex >> myInt;
// Revert to reading integers normally
MyFile >> dec;