📜  C++文件和流(1)

📅  最后修改于: 2023-12-03 14:39:59.689000             🧑  作者: Mango

C++ 文件和流

在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::ofstreamstd::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::instd::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++中的文件和流操作。我们学习了如何打开和关闭文件,如何读写文件,以及如何操作文件指针;同时,我们也了解了输入流、输出流以及文件流的使用方法。最后,我们还介绍了流控制器的概念,以及如何使用流控制器来控制流的读写操作。