📅  最后修改于: 2023-12-03 14:39:59.689000             🧑  作者: Mango
在C++中,文件是一种重要的数据存储方式,其可以经过修改和保存,以及交换与共享。C++提供了文件操作的库函数,将文件读取和写入操作变得非常简单。此外,C++还提供了流(stream)的概念,使得文件的读取和写入操作更加灵活和高效。
C++中通过fstream
来操作文件,需要包含头文件<fstream>
。下面是一个例子:
#include <fstream>
#include <iostream>
int main() {
std::ofstream file("example.txt"); // 打开文件
if (file.is_open()) { // 判断文件是否打开成功
file << "Hello world!"; // 写入文件
file.close(); // 关闭文件
} else {
std::cout << "File opening failed" << std::endl;
}
return 0;
}
在上面的例子中,我们用std::ofstream
来创建一个文件流对象,通过文件名参数来指定文件的名称,并打开文件。在打开文件的过程中,我们需要检查文件是否成功打开。如果打开成功,则可以使用<<
运算符来将数据写入文件;否则,需要给出相应的错误提示,停止程序。
在文件读取的过程中,需要使用std::ifstream
来创建文件流对象,从而读取文件中的数据。另外,也可以使用std::fstream
来同时进行文件的读写操作。
在C++中,文件的读写操作可以通过输入和输出流来实现。输入和输出流分别对应文本文件和二进制文件,可以使用std::ofstream
和std::ifstream
来实现。
下面是一个写入文件的例子:
#include <fstream>
#include <iostream>
int main() {
std::ofstream file("example.txt"); // 打开文件
if (file.is_open()) {
file << "Hello world!";
file.close();
} else {
std::cout << "File opening failed" << std::endl;
}
return 0;
}
在上面的例子中,我们创建了一个std::ofstream
对象,使用<<
运算符将数据写入文件。在写入完毕后,我们需要调用close()
函数来关闭文件流。
下面是一个读取文件的例子:
#include <fstream>
#include <iostream>
int main() {
std::ifstream file("example.txt"); // 打开文件
if (file.is_open()) {
std::string line;
while (std::getline(file, line)) { // 逐行读取文件内容
std::cout << line << std::endl;
}
file.close();
} else {
std::cout << "File opening failed" << std::endl;
}
return 0;
}
在上面的例子中,我们创建了一个std::ifstream
对象,使用getline()
函数来逐行读取文件内容,并打印输出到控制台。
在C++中,文件间读写操作都是通过文件指针(File pointer)来实现的。文件指针指向文件中的某一个位置,可以在这个位置上进行读写操作。C++提供了seekg()
和seekp()
函数来移动文件指针。其中,seekg()
用于移动输入文件指针,seekp()
用于移动输出文件指针。
下面是一个示例程序:
#include <fstream>
#include <iostream>
int main() {
std::fstream file("example.txt", std::ios::in | std::ios::out);
if (file.is_open()) {
file.seekp(6); // 移动输出文件指针至第7个字符位置
file << "C++"; // 将C++插入到文本中
file.seekg(0); // 移动输入文件指针至文件开头
std::string line;
while (std::getline(file, line)) {
std::cout << line << std::endl; // 打印修改后的内容
}
file.close();
} else {
std::cout << "File opening failed" << std::endl;
}
return 0;
}
在上面的例子中,我们创建了一个std::fstream
对象,并传入了两个参数:一个是文件名,一个是打开模式。在打开模式中,我们分别指定了std::ios::in
和std::ios::out
,表示我们需要同时对文件进行读写操作。
在程序中,我们使用seekp()
函数将输出文件指针移动至第7个位置,使用<<
运算符将字符串C++
插入到文件中。然后,我们使用seekg()
将输入文件指针移动至文件开头,使用getline()
函数逐行读取并打印修改后的内容。最后,我们调用close()
函数关闭文件流。
在C++中,流(stream)是一种广泛使用的数据传输方法,其可以自由地流动数据。在C++中,流分为输入流和输出流两种类型,我们可以通过流操作符(<<
和>>
)来实现对流的读写操作。除此之外,C++还提供了一些实用的流控制器,使得流的读写操作更加高效和灵活。
在C++中,我们可以使用标准输出流(std::cout
)来实现向控制台输出内容:
#include <iostream>
int main() {
std::cout << "Hello world!" << std::endl;
return 0;
}
在上面的例子中,我们使用流操作符(<<
)将字符串Hello world!
输出到控制台,并用换行符(std::endl
)将光标移动到下一行。同样的,我们也可以使用<<
运算符将其他数据类型输出到控制台:
#include <iostream>
int main() {
int x = 10;
double y = 3.14;
std::cout << "x = " << x << ", y = " << y << std::endl;
return 0;
}
在上面的例子中,我们用逗号分隔多个输出内容,将其依次输出到控制台。
在C++中,我们可以使用标准输入流(std::cin
)来实现从控制台输入内容:
#include <iostream>
int main() {
int x;
std::cout << "Please enter a number: ";
std::cin >> x;
std::cout << "The number you entered is: " << x << std::endl;
return 0;
}
在上面的例子中,我们使用流操作符(>>
)将用户输入的内容存储到变量x
中,并输出到控制台。
在C++中,我们可以使用文件流来实现对文件的读写操作。文件流分为输入文件流(std::ifstream
)和输出文件流(std::ofstream
),我们可以使用它们来分别打开文件的读取和写入操作。
下面是一个写入二进制文件的例子:
#include <fstream>
#include <iostream>
struct Person {
char name[20];
int age;
};
int main() {
std::ofstream file("example.dat", std::ios::binary); // 打开二进制文件
if (file.is_open()) {
Person p{"Tom", 20};
file.write(reinterpret_cast<char*>(&p), sizeof(Person)); // 写入二进制数据
file.close();
} else {
std::cout << "File opening failed" << std::endl;
}
return 0;
}
在上面的例子中,我们创建了一个std::ofstream
对象,并传入了两个参数:一个是文件名,一个是打开模式(std::ios::binary
表示二进制模式)。在写入操作中,我们使用write()
函数将结构体Person
的数据写入到文件中,调用close()
函数关闭文件流。
下面是一个读取二进制文件的例子:
#include <fstream>
#include <iostream>
struct Person {
char name[20];
int age;
};
int main() {
std::ifstream file("example.dat", std::ios::binary); // 打开二进制文件
if (file.is_open()) {
Person p;
file.read(reinterpret_cast<char*>(&p), sizeof(Person)); // 读取二进制数据
std::cout << "name: " << p.name << ", age: " << p.age << std::endl;
file.close();
} else {
std::cout << "File opening failed" << std::endl;
}
return 0;
}
在上面的例子中,我们创建了一个std::ifstream
对象,并传入了两个参数:一个是文件名,一个是打开模式(std::ios::binary
表示二进制模式)。在读取操作中,我们使用read()
函数从文件中读取Person
结构体的数据,并打印输出到控制台。最后,我们调用close()
函数关闭文件流。
在C++中,我们可以使用流控制器(stream manipulator)来控制流的读写操作。流控制器是一种特殊的函数,通常使用std::
前缀来引用。下面是一些常见的流控制器:
std::endl
:添加换行符并刷新流;std::setw(n)
:设置下一个输出值的宽度为n个字符;std::setfill(c)
:设置空格填充字符为c;std::setprecision(n)
:设置浮点数输出精度为n位小数。下面是一个使用流控制器的例子:
#include <iostream>
#include <iomanip>
int main() {
double x = 3.141592653589793;
std::cout << std::setprecision(3) << std::setw(10) << std::setfill('0') << x << std::endl;
return 0;
}
在上面的例子中,我们使用std::setprecision()
来设置浮点数的输出精度为3位小数;使用std::setw()
来设置输出宽度为10个字符;使用std::setfill()
来设置空格填充字符为0
。最后,我们使用std::endl
输出换行符并刷新流。 输出结果为:
00003.14
本文介绍了C++中的文件和流操作。我们学习了如何打开和关闭文件,如何读写文件,以及如何操作文件指针;同时,我们也了解了输入流、输出流以及文件流的使用方法。最后,我们还介绍了流控制器的概念,以及如何使用流控制器来控制流的读写操作。