#include <fstream>
文件输入输出流 file stream。注意每次对文件的操作完成后,一定一定要关闭文件!!!!!
fstream的第二个参数
std::ios::
是C++中用于设置文件流(std::fstream
)行为的一组标志。这些标志可以通过按位或运算符 |
来组合使用。以下是一些常见的 std::ios::
标志及其含义:
-
std::ios::in
:- 含义:打开文件以供读取。
- 作用:允许从文件中读取数据。
-
std::ios::out
:- 含义:打开文件以供写入。
- 作用:允许将数据写入文件。如果文件已存在,写入会覆盖现有内容。如果文件不存在,则会创建新文件。
-
std::ios::binary
:- 含义:以二进制模式打开文件。
- 作用:在此模式下,文件将以二进制方式进行读取和写入,不会执行文本文件的文本处理。适用于处理二进制数据。
-
std::ios::app
:- 含义:以附加模式打开文件。
- 作用:在附加模式下,文件内容将被保留,并且写入的数据将追加到文件的末尾,而不是覆盖现有内容。
-
std::ios::trunc
:- 含义:截断文件。
- 作用:如果文件已经存在且以写入模式打开,将截断(清空)文件的内容。如果文件不存在,则忽略此标志。
-
std::ios::ate
:- 含义:打开文件并将文件指针移到文件的末尾。
- 作用:文件打开后,文件指针会立即移到文件的末尾,允许直接追加数据。
-
std::ios::nocreate
:- 含义:不创建新文件。
- 作用:如果文件不存在,将不会创建新文件。如果尝试打开一个不存在的文件,并且未设置此标志,将创建一个新文件。
-
std::ios::noreplace
:- 含义:不替换已存在的文件。
- 作用:如果文件已经存在,将不会覆盖或替换它。如果尝试打开一个已存在的文件,并且未设置此标志,将覆盖现有文件内容。
-
这些标志可以通过按位或运算符
|
组合,以满足特定的文件操作需求。例如,要以二进制、附加和以输出方式打开文件,可以将这些标志组合起来:std::fstream file("example.bin", std::ios::binary | std::ios::out | std::ios::app);
- 此代码将以二进制、附加和输出模式打开名为 “example.bin” 的文件,允许在文件末尾追加二进制数据。
是的,std::ifstream
和std::ofstream
分别是C++标准库中用于文件输入和输出的类。它们具有以下默认行为:
- 此代码将以二进制、附加和输出模式打开名为 “example.bin” 的文件,允许在文件末尾追加二进制数据。
ifstream && ofstream
-
std::ifstream
默认用于读取(输入)文件。这意味着不需要显式指定std::ios::in
标志。仅读取文件推荐使用!例如:
std::ifstream inputFile("example.txt"); // 等效于:std::ifstream inputFile("example.txt", std::ios::in); // std::fstream inputFile("example.txt", std::ios::in);
-
std::ofstream
默认用于写入(输出)文件。这意味着不需要显式指定std::ios::out
标志。仅写入文件推荐使用!例如:
std::ofstream outputFile("output.txt"); // 等效于:std::ofstream outputFile("output.txt", std::ios::out); // std::fstream outputFile("output.txt", std::ios::out);
对每次写出文件有特殊需求的示例
// 删去同名字文件 std::fstream outputFile("output.txt", std::ios::out | std::ios::trunc); // 在文件末尾追加数据 std::fstream outputFile("output.txt", std::ios::out | std::ios::app);
- 这种默认行为使得在打开文件时更加方便,特别是在只需要执行读取或写入操作时。如果需要更复杂的文件操作,可以使用
std::ios::
标志来配置文件流的行为,如在前面的回答中所描述的。
要打开一个文件以进行可读可写的操作,您可以使用std::fstream
类,该类允许您同时进行读取和写入。在打开文件时,您需要指定相应的标志来表示读取和写入操作。
读写示例
#include <iostream>
#include <fstream>
int main() {
std::fstream file("example.txt", std::ios::in | std::ios::out);
if (!file.is_open()) {
std::cerr << "Failed to open the file!" << std::endl;
return 1;
}
// 读取文件内容
std::string line;
while (std::getline(file, line)) {
std::cout << "Read: " << line << std::endl;
}
// 在文件末尾添加新内容
file << "This is a new line added to the file." << std::endl;
// 移动文件指针到文件开头,并写入新内容
file.seekp(0, std::ios::beg);
file << "This is new content at the beginning of the file." << std::endl;
file.close();
return 0;
}
在这个示例中,我们首先用 std::ios::in | std::ios::out
标志打开了文件,允许读取和写入操作。然后,我们使用 getline
从文件中读取内容,并使用 <<
操作符将新内容写入文件。通过使用 seekp
函数,我们还可以移动文件指针到文件的开头,并在开头插入新的内容。
注意,文件的打开模式取决于个人需求。
C语言
"r" - 读取模式(Read):打开文件进行读取。如果文件不存在,操作将失败。
"w" - 写入模式(Write):创建一个新文件进行写入。如果文件已经存在,则截断文件(即清空文件内容)。
"a" - 追加模式(Append):打开文件进行写入,但是不清空文件内容。如果文件不存在,则创建文件。
"rb" - 读取二进制模式(Read Binary):以二进制模式打开文件进行读取。
"wb" - 写入二进制模式(Write Binary):以二进制模式创建一个新文件进行写入。
"ab" - 追加二进制模式(Append Binary):以二进制模式打开文件进行写入,不清空文件内容。
"r+" - 读取/写入模式(Read/Write):打开文件进行读取和写入。文件必须已经存在。
"w+" - 读取/写入模式(Read/Write):创建一个新文件进行读取和写入。如果文件已经存在,则截断文件。
"a+" - 读取/追加模式(Read/Append):打开文件进行读取和追加写入。如果文件不存在,则创建文件。
"r+b" 或 "rb+" - 读取/写入二进制模式(Read/Write Binary)。
"w+b" 或 "wb+" - 读取/写入二进制模式(Read/Write Binary)。
"a+b" 或 "ab+" - 读取/追加二进制模式(Read/Append Binary)