fstream库:与文件共舞,为数据编写华尔兹

🕊️在C++中,使用using namespace std 和每次写 std:: 进行输入输出有各自的优点和缺点

🕊️实验环境:DevC++5.11支持C98标准[不是最新标准]文章更新中

在这里插入图片描述

C++ <fstream>库介绍

C++ 中,对文件的写入操作可以使用标准库中的 fstream 。fstream 库提供了用于文件输入/输出的类,包括 ifstream (用于文件输入)、 ofstream (用于文件输出)和 fstream (用于同时进行文件输入和输出)。

1.ifstream:用于文输入件流。

  • 适用场合:当你需要从文件中取出数据(类)时。
  • 示例代码
#include <iostream>  
#include <fstream>  
#include <string>  
  
int main() {  
    std::ifstream inputFile("example.txt"); // 打开文件 example.txt  
    if (!inputFile) { // 检查文件是否成功打开  
        std::cout << "无法打开文件" << std::endl;  
        return 1; // 或者其他错误处理方式  
    }  
    int number; // 定义一个整数变量用于存储读取的数据  
    inputFile >> number; // 从文件中读取整数并存储到变量中  
    std::string line; // 定义一个字符串变量用于存储读取的行数据  
    getline(inputFile, line); // 从文件中读取一行数据并存储到变量中  
    inputFile.close(); // 关闭文件流  
    std::cout << "读取的整数: " << number << std::endl; // 输出读取的整数数据  
    std::cout << "读取的行数据: " << line << std::endl; // 输出读取的行数据  
    return 0; // 正常退出程序  
}

2.ofstream:用于文件输出。

  • 适用场合:当你需要将__数据写入文件__时。
  • 示例代码:
#include <fstream>  
#include <iostream>  
  
int main() {  
    std::ofstream outfile("example.txt"); // 创建一个名为 "example.txt" 的输出文件流  
    if (outfile.is_open()) { // 检查文件是否成功打开  
        outfile << "Hello, world!" << std::endl; // 向文件中写入数据  
        outfile.close(); // 关闭文件流  
        std::cout << "Data written to file." << std::endl;  
    } else {  
        std::cout << "Unable to open file." << std::endl;  
    }  
    return 0;  
}

3.fstream:用于文件输入/输出。

  • 适用场合:当你需要同时进行文件输入和输出时。
  • 例如,读取文件内容并将其写入另一个文件。
  • 示例代码:1️⃣
#include <fstream>  
#include <iostream>  
#include <string>  
  
int main() {  
    std::fstream file("input.txt", std::ios::in | std::ios::out); // 打开一个名为 "input.txt" 的输入/输出文件流  
    std::string line;  
    if (file.is_open()) { // 检查文件是否成功打开  
        while (std::getline(file, line)) { // 从文件中读取每一行  
            std::cout << line << std::endl; // 输出读取到的内容到控制台  
        }  
        file.close(); // 关闭文件流  
    } else {  
        std::cout << "Unable to open file." << std::endl;  
    }  
    return 0;  
}
  • 2️⃣
#include <fstream>
#include <iostream>

int main() {
    std::fstream file("file.txt", std::ios::in | std::ios::out); // 打开名为file.txt的文件以进行读写
    if (file.is_open()) {
        std::string line;
        while (std::getline(file, line)) { // 逐行读取文件内容
            std::cout << line << std::endl; // 输出每行内容
        }
        
        file.seekp(0, std::ios::end); // 将写指针移动到文件末尾
        file << "New line"; // 在文件末尾添加新行
        
        file.close(); // 关闭文件
    } else {
        std::cout << "Failed to open file!" << std::endl;
    }

    return 0;
}

4.endl、is_open()、close()、>>:简介

1️⃣ std::endl:用于插入一个换行符并刷新输出缓冲区。在写入文件时,使用std::endl可以确保数据立即写入文件,而不是等待缓冲区满或程序结束时才写入。

2️⃣检查文件是否成功打开:在写入数据之前,最好检查文件是否成功打开。如果文件无法打开(例如,由于权限问题或磁盘空间不足),则不应尝试写入数据。可以使用is_open()函数来检查文件是否成功打开。

3️⃣关闭文件流:完成文件写入后,应关闭文件流以释放资源。可以使用close()函数来关闭文件流。

4️⃣从文件中读取数据:使用>>运算符从文件中读取数据。

示例,从文件中读取整数:

int number;  
inputFile >> number;

5️⃣6️⃣7️⃣

🕑C++库介绍

<cstdio>C++标准库中的一个头文件,它提供了 C 风格的输入输出功能。这个库主要包含一些与文件操作、输入输出相关的函数,如 printfscanffopen 等。

C++中使用<cstdio>,你可以进行一些基本的 I/O 操作,比如从标准输入(通常是键盘)读取数据或向标准输出(通常是屏幕)打印数据。

1.remove:用于删除文件

  • 适用场合:当你需要删除文件时。
  • 你可以按照以下步骤进行操作:
    1.检查文件是否存在。
    2.提示用户删除是否成功。
    3.提示用户是否需要备份。
    4.确认用户是否真的想删除。
    5.输出错误信息或成功消息。

以下是一个示例代码:❎

  • 示例代码:1️⃣
#include <iostream>  
#include <cstdio>  
#include <filesystem>  
  
namespace fs = std::filesystem;  
  
int main() {  
    const std::string filename = "file.txt";  
    if (!fs::exists(filename)) {  
        std::cerr << "File does not exist!" << std::endl;  
        return 1; // 返回非零值表示程序异常退出  
    }  
  
    std::error_code ec;  
    if (std::remove(filename, ec) != 0) {  
        std::cerr << "Failed to delete file: " << ec.message() << std::endl;  
        return 1; // 返回非零值表示程序异常退出  
    } else {  
        std::cout << "File deleted successfully!" << std::endl;  
    }  
  
    std::cout << "Do you want to backup the file? (y/n) ";  
    char choice;  
    std::cin >> choice;  
    if (choice == 'y' || choice == 'Y') {  
        // 这里可以添加备份文件的代码  
        std::cout << "Backing up file..." << std::endl;  
    } else {  
        std::cout << "No backup created." << std::endl;  
    }  
  
    std::cout << "Are you sure you want to delete the file? (y/n) ";  
    std::cin >> choice;  
    if (choice != 'y' && choice != 'Y') {  
        std::cout << "Deletion cancelled." << std::endl;  
        return 0; // 返回0表示程序正常退出  
    }  
  
    return 0; // 返回0表示程序正常退出  
}

①编译错误:
3 24 E:\MANIA\blog\cs\z240115_cs_fi\re1\re1.cpp [Error] filesystem: No such file or directory。

2️⃣❎
我们需要移除对<filesystem>头文件的引用,因为这个头文件是在C++17中引入的,而C++98并不支持它。如果你想使用文件系统操作,你可能需要使用更低级别的系统调用或第三方库。

  • 修改后的代码:
#include <iostream>  
#include <cstdio>  
#include <fstream>  
#include <cstdlib>  
  
int main() {  
    const std::string filename = "file.txt";  
  
    // 检查文件是否存在  
    std::ifstream file(filename);  
    if (!file.is_open()) {  
        std::cerr << "File does not exist!" << std::endl;  
        return 1; // 返回非零值表示程序异常退出  
    }  
  
    // 关闭文件流  
    file.close();  
  
    // 删除文件  
    std::remove(filename.c_str());  
  
    // 以下部分代码仍然可以在C++98中正常工作:  
    std::cout << "Do you want to backup the file? (y/n) ";  
    char choice;  
    std::cin >> choice;  
    if (choice == 'y' || choice == 'Y') {  
        std::cout << "Backing up file..." << std::endl;  
    } else {  
        std::cout << "No backup created." << std::endl;  
    }  
  
    std::cout << "Are you sure you want to delete the file? (y/n) ";  
    std::cin >> choice;  
    if (choice != 'y' && choice != 'Y') {  
        std::cout << "Deletion cancelled." << std::endl;  
        return 0; // 返回0表示程序正常退出  
    }  
  
    return 0; // 返回0表示程序正常退出  
}

②编译错误:
10 32 E:\MANIA\blog\cs\z240115_cs_fi\re2\re2.cpp [Error] no matching function for call to ‘std::basic_ifstream::basic_ifstream(const string&)’
解决办法参考下方案:

3️⃣✅
试图用字符串来初始化一个std::ifstream对象,但是std::ifstream并没有接受std::string参数的构造函数。这就是为什么编译器找不到匹配的函数来调用。你可以通过将 std::string转换为const char*来解决这个问题。你可以使用 std::string::c_str()方法来实现这一点。

  • 修改后的代码:
#include <iostream>    
#include <cstdio>    
#include <fstream>    
#include <cstdlib>    
    
int main() {    
    const std::string filename = "file.txt";    
    
    // 检查文件是否存在    
    std::ifstream file(filename.c_str());  // 注意这里我们使用的是 filename.c_str()  
    if (!file.is_open()) {    
        std::cerr << "File does not exist!" << std::endl;    
        return 1; // 返回非零值表示程序异常退出    
    }    
    
    // 关闭文件流    
    file.close();    
    
    // 删除文件    
    std::remove(filename.c_str());    
    
    // 以下部分代码仍然可以在C++98中正常工作:    
    std::cout << "Do you want to backup the file? (y/n) ";    
    char choice;    
    std::cin >> choice;    
    if (choice == 'y' || choice == 'Y') {    
        std::cout << "Backing up file..." << std::endl;    
    } else {    
        std::cout << "No backup created." << std::endl;    
    }    
    
    std::cout << "Are you sure you want to delete the file? (y/n) ";    
    std::cin >> choice;    
    if (choice != 'y' && choice != 'Y') {    
        std::cout << "Deletion cancelled." << std::endl;    
        return 0; // 返回0表示程序正常退出    
    }    
    
    return 0; // 返回0表示程序正常退出    
}

2.rename:用于重命名文件

  • 适用场合:当你需要重命名文件时。
  • 你可以按照以下步骤进行操作:
    1.检查文件是否存在。
    2.提示用户是否需要备份。
    3.确认用户是否真的想重命名。
  • 示例代码:1️⃣❎
#include <iostream>  
#include <cstdio>  
#include <fstream> // 需要包含 fstream 头文件来使用 ofstream 类  
  
int main() {  
    const std::string filename = "old_name.txt";  
    const std::string backupFilename = "backup_" + filename; // 备份文件的文件名  
  
    // 检查文件是否存在  
    std::ifstream file(filename);  
    if (!file.is_open()) {  
        std::cerr << "File does not exist!" << std::endl;  
        return 1; // 返回非零值表示程序异常退出  
    }  
  
    // 询问是否备份文件  
    std::cout << "Do you want to backup the file? (y/n) ";  
    char choice;  
    std::cin >> choice;  
    if (choice == 'y' || choice == 'Y') {  
        // 创建备份文件  
        std::ofstream backupFile(backupFilename); // 打开备份文件  
        if (!backupFile.is_open()) { // 检查备份文件是否成功创建  
            std::cerr << "Failed to create backup file!" << std::endl;  
            return 1; // 返回非零值表示程序异常退出  
        }  
        backupFile << "This is a backup of " << filename << std::endl; // 将一些信息写入备份文件  
        backupFile.close(); // 关闭备份文件  
    }  
  
    // 重命名文件  
    if (std::rename(filename, "new_name.txt") != 0) { // 将 old_name.txt 重命名为 new_name.txt  
        std::cout << "Failed to rename file!" << std::endl;  
        return 1; // 返回非零值表示程序异常退出  
    }  
  
    std::cout << "File renamed successfully!" << std::endl;  
  
    return 0; // 返回0表示程序正常退出  
}

① 编译错误:
3 24 E:\MANIA\blog\cs\z240115_cs_fi\re1\re1.cpp [Error] filesystem: No such file or directory。

2️⃣❎
看起来你正在尝试使用std::ifstream对象来打开一个文件,但你使用了错误的构造函数。std::ifstream的构造函数并不接受一个std::string类型的参数。你应该使用std::ifstream的成员函数open()来打开文件。

  • 修改后的代码:
#include <iostream>    
#include <cstdio>    
#include <fstream> // 需要包含 fstream 头文件来使用 ofstream 类    
    
int main() {    
    const std::string filename = "old_name.txt";    
    const std::string backupFilename = "backup_" + filename; // 备份文件的文件名    
    
    // 检查文件是否存在    
    std::ifstream file;  
    file.open(filename);  
    if (!file.is_open()) {    
        std::cerr << "File does not exist!" << std::endl;    
        return 1; // 返回非零值表示程序异常退出    
    }    
    
    // 询问是否备份文件    
    std::cout << "Do you want to backup the file? (y/n) ";    
    char choice;    
    std::cin >> choice;    
    if (choice == 'y' || choice == 'Y') {    
        // 创建备份文件    
        std::ofstream backupFile(backupFilename); // 打开备份文件    
        if (!backupFile.is_open()) { // 检查备份文件是否成功创建    
            std::cerr << "Failed to create backup file!" << std::endl;    
            return 1; // 返回非零值表示程序异常退出    
        }    
        backupFile << "This is a backup of " << filename << std::endl; // 将一些信息写入备份文件    
        backupFile.close(); // 关闭备份文件    
    }    
    
    // 重命名文件    
    if (std::rename(filename, "new_name.txt") != 0) { // 将 old_name.txt 重命名为 new_name.txt    
        std::cout << "Failed to rename file!" << std::endl;    
        return 1; // 返回非零值表示程序异常退出    
    }    
    
    std::cout << "File renamed successfully!" << std::endl;    
    
    return 0; // 返回0表示程序正常退出    
}

②编译错误:
11 23 E:\MANIA\blog\cs\z240115_cs_fi\ren1\ren1.cpp [Error] no matching function for call to ‘std::basic_ifstream::open(const string&)’
23 48 E:\MANIA\blog\cs\z240115_cs_fi\ren1\ren1.cpp [Error] no matching function for call to ‘std::basic_ofstream::basic_ofstream(const string&)’
33 45 E:\MANIA\blog\cs\z240115_cs_fi\ren1\ren1.cpp [Error] cannot convert ‘const string {aka const std::basic_string}’ to ‘const char*’ for argument ‘1’ to ‘int rename(const char*, const char*)’

解决办法参考下方案:

3️⃣✅
你的代码中使用了std::ifstreamopen方法,但实际上std::ifstream并没有open这个方法。你应该使用构造函数来打开文件。
这是因为std::string没有与std::ifstream的构造函数直接兼容的构造函数,但你可以使用c_str()方法来获取一个指向其内容的常量字符指针。

  • 修改后的代码:
#include <iostream>        
#include <cstdio>        
#include <fstream> // 需要包含 fstream 头文件来使用 ofstream 类        
        
int main() {        
    const std::string filename = "old_name.txt";        
    const std::string backupFilename = "backup_" + filename; // 备份文件的文件名        
        
    // 检查文件是否存在        
    std::ifstream file(filename.c_str());      
    if (!file.is_open()) {        
        std::cerr << "File does not exist!" << std::endl;        
        return 1; // 返回非零值表示程序异常退出        
    }        
        
    // 询问是否备份文件        
    std::cout << "Do you want to backup the file? (y/n) ";        
    char choice;        
    std::cin >> choice;        
    if (choice == 'y' || choice == 'Y') {        
        // 创建备份文件        
        std::ofstream backupFile(backupFilename.c_str()); // 打开备份文件        
        if (!backupFile.is_open()) { // 检查备份文件是否成功创建        
            std::cerr << "Failed to create backup file!" << std::endl;        
            return 1; // 返回非零值表示程序异常退出        
        }        
        backupFile << "This is a backup of " << filename << std::endl; // 将一些信息写入备份文件        
        backupFile.close(); // 关闭备份文件        
    }        
        
    // 重命名文件        
    if (std::rename(filename.c_str(), "new_name.txt") != 0) { // 将 old_name.txt 重命名为 new_name.txt        
        std::cout << "Failed to rename file!" << std::endl;        
        return 1; // 返回非零值表示程序异常退出        
    }        
        
    std::cout << "File renamed successfully!" << std::endl;        
        
    return 0; // 返回0表示程序正常退出        
}

C++文件写实战案例

1🐉在C++中,你可以使用 ofstream 来写入 char 类型的数据。*[HTML]: 文件名 o1.cpp
以下是一个简单的例子:

#include <fstream>  
#include <iostream>  
  
int main() {  
    std::ofstream outfile("example.txt"); // 创建一个ofstream对象并打开一个文件  
  
    if (!outfile) { // 检查文件是否成功打开  
        std::cerr << "无法打开文件" << std::endl;  
        return 1;  
    }  
  
    char data[] = {'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd', '\n'}; // 定义一个char数组  
    outfile.write(data, sizeof(data)); // 将数据写入文件  
  
    outfile.close(); // 关闭文件  
  
    return 0;  
}
这个程序会创建一个名为 "example.txt" 的文件(如果该文件已经存在,则会被清空),然后将字符数组 data 中的数据写入这个文件。最后,它会关闭文件。注意, write() 函数的第二个参数是你要写入的字节数,所以这里我们使用 sizeof(data) 来得到这个数值。

2✨在C++中,你可以使用 ofstream 来写入 char* 类型的数据。

以下是一个简单的例子:

#include <fstream>  
#include <iostream>  
#include <cstring> 
int main() {  
    std::ofstream outfile("example.txt"); // 创建一个ofstream对象并打开一个文件  
  
    if (!outfile) { // 检查文件是否成功打开  
        std::cerr << "无法打开文件" << std::endl;  
        return 1;  
    }  
  
    char* data = "Hello World\n"; // 定义一个char指针指向一个字符串  
    outfile.write(data, std::strlen(data)); // 将数据写入文件  
  
    outfile.close(); // 关闭文件  
  
    return 0;  
}

这个程序会创建一个名为“example.txt” 的文件(如果该文件已经存在,则会被清空),然后将 data 指向的字符串写入这个文件。最后,它会关闭文件。这里我们使用 strlen() 函数来获取要写入的字节数。


3🐧在C++中,你可以使用 ofstream 来写入 char*[] 类型的数据,也就是字符指针数组。

以下是一个简单的例子:

#include <fstream>  
#include <iostream>  
#include <cstring>
int main() {  
    std::ofstream outfile("example.txt"); // 创建一个ofstream对象并打开一个文件  
  
    if (!outfile) { // 检查文件是否成功打开  
        std::cerr << "无法打开文件" << std::endl;  
        return 1;  
    }  
  
    char* data[] = {"Hello", "World", "!"}; // 定义一个char指针数组  
    int size = sizeof(data) / sizeof(char*); // 计算数组元素个数  
  
    for (int i = 0; i < size; i++) {  
        outfile.write(data[i], std::strlen(data[i])); // 将数据写入文件  
        outfile << '\n'; // 换行  
    }  
  
    outfile.close(); // 关闭文件  
  
    return 0;  
}

这个程序会创建一个名为 “example.txt” 的文件(如果该文件已经存在,则会被清空),然后将 data 指向的字符串数组写入这个文件,每个字符串占一行。最后,它会关闭文件。这里我们使用 sizeof() 函数来计算数组元素个数,然后使用循环来依次写入每个字符串。

4🌌在C++中,你也可以使用 ofstream 来写入 std::string 类型的数据。

以下是一个简单的例子:

#include <fstream>  
#include <iostream>  
#include <string>  
  
int main() {  
    std::ofstream outfile("example.txt"); // 创建一个ofstream对象并打开一个文件  
  
    if (!outfile) { // 检查文件是否成功打开  
        std::cerr << "无法打开文件" << std::endl;  
        return 1;  
    }  
  
    std::string data = "Hello World!"; // 定义一个string对象  
    outfile << data; // 将数据写入文件  
  
    outfile.close(); // 关闭文件  
  
    return 0;  
}

这个程序会创建一个名为“example.txt”的文件(如果该文件已经存在,则会被清空),然后将 data 指向的字符串写入这个文件。最后,它会关闭文件。这里我们使用 << 运算符来将字符串写入文件。


5🐉在C++中,你也可以使用 ofstream 来写入 std::string[] 类型的数据,也就是字符串数组。

以下是一个简单的例子:

#include <fstream>  
#include <iostream>  
#include <string>  
  
int main() {  
    std::ofstream outfile("example.txt"); // 创建一个ofstream对象并打开一个文件  
  
    if (!outfile) { // 检查文件是否成功打开  
        std::cerr << "无法打开文件" << std::endl;  
        return 1;  
    }  
  
    std::string data[] = {"Hello", "World", "!"}; // 定义一个string数组  
    int size = sizeof(data) / sizeof(std::string); // 计算数组元素个数  
  
    for (int i = 0; i < size; i++) {  
        outfile << data[i] << '\n'; // 将数据写入文件,每个字符串占一行  
    }  
  
    outfile.close(); // 关闭文件  
  
    return 0;  
}

这个程序会创建一个名为 “example.txt”的文件(如果该文件已经存在,则会被清空),然后将 data 指向的字符串数组写入这个文件,每个字符串占一行。最后,它会关闭文件。这里我们使用 sizeof() 函数来计算数组元素个数,然后使用循环来依次写入每个字符串。


6🕊️在C++中,如果你想将std::string[]类型的数据添加到已存在的file.txt文件中,而不是覆盖原有的内容,你可以使用ofstreamseekp方法来将写入位置移动到文件末尾。

以下是一个简单的例子:

#include <fstream>  
#include <iostream>  
#include <string>  
  
int main() {  
    std::ofstream outfile("file.txt", std::ios::app); // 创建一个ofstream对象并将文件打开模式设置为追加  
  
    if (!outfile) { // 检查文件是否成功打开  
        std::cerr << "无法打开文件" << std::endl;  
        return 1;  
    }  
  
    std::string data[] = {"Hello", "World", "!"}; // 定义一个string数组  
    int size = sizeof(data) / sizeof(std::string); // 计算数组元素个数  
  
    for (int i = 0; i < size; i++) {  
        outfile << data[i] << '\n'; // 将数据写入文件,每个字符串占一行  
    }  
  
    outfile.close(); // 关闭文件  
  
    return 0;  
}

这个程序会将data指向的字符串数组追加到名为file.txt的文件末尾,每个字符串占一行。这里我们使用std::ios::app作为ofstream的打开模式,以确保数据被追加到文件末尾而不是覆盖原有内容。最后,它会关闭文件。


7🐜在C++中,如果你想将std::string[]类型的数据添加到已存在的file.txt文件的指定行,这会比较复杂,因为标准库并没有直接提供这样的功能。你需要先读取整个文件内容,修改指定行的数据,然后再写回文件。

以下是一个简单的例子,演示如何将一个新的字符串添加到文件中的指定行:❎

#include <fstream>  
#include <iostream>  
#include <string>  
#include <vector>  
  
void insertDataIntoLine(const std::string& filePath, int lineNumber, const std::string& data) {  
    std::ifstream infile(filePath); // 打开文件进行读取  
    std::ofstream outfile(filePath, std::ios::out | std::ios::in); // 打开文件进行写入和读取  
  
    std::string line;  
    int currentLineNumber = 1;  
    std::vector<std::string> lines; // 存储文件的所有行  
  
    // 读取文件内容并存储到lines中  
    while (std::getline(infile, line)) {  
        lines.push_back(line);  
    }  
  
    infile.close(); // 关闭输入文件流  
  
    // 修改指定行的数据  
    if (currentLineNumber == lineNumber) {  
        lines[currentLineNumber - 1] = data; // 注意行号是从1开始的,所以需要减1  
    }  
  
    // 将修改后的内容写回文件  
    for (const auto& line : lines) {  
        outfile << line << '\n';  
    }  
  
    outfile.close(); // 关闭输出文件流  
}  
  
int main() {  
    insertDataIntoLine("file.txt", 3, "New Data"); // 将"New Data"添加到文件file.txt的第三行  
    return 0;  
}

这个程序定义了一个insertDataIntoLine函数,它接受文件路径、要修改的行号和要添加的数据作为参数。该函数首先读取整个文件内容并存储到一个std::vector中,然后修改指定行的数据,最后将修改后的内容写回文件。请注意,行号是从1开始的,所以在修改数据时需要减1。

✅7🐜

1️⃣第7行报错:no matching function for call to 'std::basic_ifstream<char>::basic_ifstream(const string&)'。这个错误是因为在使用 std::ifstream的构造函数时,你传入了一个 std::string类型的参数 filePath,但是C++98模式中的 std::ifstream不支持直接接受 std::string类型的参数。解决办法是将 filePath转换为C风格的字符串,例如使用 filePath.c_str()
2️⃣第27行报错:range-based 'for' loops are not allowed in C++98 mode这个错误是因为你的编译器的C++标准模式设置为了C++98,C++98标准中不支持range-for循环语句。解决办法是将编译器的C++标准模式设置为更高的标准,例如C++11以上。

#include <fstream>  
#include <iostream>  
#include <string>  
#include <vector>  
  
void insertDataIntoLine(const std::string& filePath, int lineNumber, const std::string& data) {  
    std::ifstream infile(filePath.c_str()); // 将std::string转换为C风格的字符串  
    std::ofstream outfile(filePath.c_str(), std::ios::out | std::ios::in); // 将std::string转换为C风格的字符串  
  
    std::string line;  
    int currentLineNumber = 1;  
    std::vector<std::string> lines; // 存储文件的所有行  
  
    // 读取文件内容并存储到lines中  
    while (std::getline(infile, line)) {  
        lines.push_back(line);  
    }  
  
    infile.close(); // 关闭输入文件流  
  
    // 修改指定行的数据  
    if (currentLineNumber == lineNumber) {  
        lines[currentLineNumber - 1] = data; // 注意行号是从1开始的,所以需要减1  
    }  
  
    // 将修改后的内容写回文件  
    for (std::vector<std::string>::const_iterator it = lines.begin(); it != lines.end(); ++it) {  
        const std::string& line = *it;  
        outfile << line << '\n';  
    }  
  
    outfile.close(); // 关闭输出文件流  
}  
  
int main() {  
    insertDataIntoLine("file.txt", 3, "New Data"); // 将"New Data"添加到文件file.txt的第三行  
    return 0;  
}

至于可以正确使用这段代码的编辑器或环境,任何支持较新C++标准的编译器和开发环境都可以。具体要依赖于你使用的编译器和版本。常用的编译器例如GCC、Clang、Visual Studio等都支持较新的C++标准。


8🎈要使用ofstreamstring[]类型数据修改到file.txt文件的指定行,你可以按照以下步骤进行操作:

  1. 打开文件进行读取和写入操作。
  2. 读取文件内容并存储到一个vector<string>中。
  3. 修改指定行的数据。
  4. 将修改后的内容写回文件。
  5. 关闭文件流。

以下是一个示例代码:❎

#include <fstream>  
#include <iostream>  
#include <string>  
#include <vector>  
  
void modifyDataInLine(const std::string& filePath, int lineNumber, const std::string& data) {  
    std::ifstream infile(filePath); // 打开文件进行读取  
    std::ofstream outfile(filePath, std::ios::out | std::ios::in); // 打开文件进行写入和读取  
  
    std::string line;  
    int currentLineNumber = 1;  
    std::vector<std::string> lines; // 存储文件的所有行  
  
    // 读取文件内容并存储到lines中  
    while (std::getline(infile, line)) {  
        lines.push_back(line);  
    }  
  
    infile.close(); // 关闭输入文件流  
  
    // 修改指定行的数据  
    if (currentLineNumber == lineNumber) {  
        lines[currentLineNumber - 1] = data; // 注意行号是从1开始的,所以需要减1  
    }  
  
    // 将修改后的内容写回文件  
    for (const auto& line : lines) {  
        outfile << line << '\n';  
    }  
  
    outfile.close(); // 关闭输出文件流  
}  
  
int main() {  
    modifyDataInLine("file.txt", 3, "New Data"); // 将"New Data"修改为文件file.txt的第三行数据  
    return 0;  
}

这段代码将打开名为file.txt的文件,读取其内容,并将第三行的数据修改为"New Data"。然后,它将修改后的内容写回文件并关闭文件流。请确保在运行代码之前替换实际的文件路径和行号。

✅8🎈

1️⃣经过检查,发现DevC++ 5.11 中没有直接支持使用std::string作为参数的std::ifstream构造函数。为了解决这个问题,你可以尝试将std::string转换为C风格的字符串,然后将C风格的字符串传递给std::ifstream构造函数。

2️⃣第27行的使用了range-basedfor循环语句。这个错误的原因是你的编译器的C++标准模式设置为了C++98,在C++98标准中不支持range-basedfor循环语句。

要解决这个问题,你可以将编译器的C++标准模式设置为更高的标准,例如C++11以上。在较新的C++标准中,range-basedfor循环语句是支持的。修改代码如下:

#include <fstream>
#include <iostream>
#include <string>
#include <vector>

void modifyDataInLine(const std::string& filePath, int lineNumber, const std::string& data) {
    std::ifstream infile(filePath.c_str()); // 将std::string转换为C风格的字符串
    std::ofstream outfile(filePath.c_str(), std::ios::out | std::ios::in); // 将std::string转换为C风格的字符串 // 打开文件进行写入和读取

    std::string line;
    int currentLineNumber = 1;
    std::vector<std::string> lines; // 存储文件的所有行

    // 读取文件内容并存储到lines中
    while (std::getline(infile, line)) {
        lines.push_back(line);
    }

    infile.close(); // 关闭输入文件流

    // 修改指定行的数据
    if (currentLineNumber == lineNumber) {
        lines[currentLineNumber - 1] = data; // 注意行号是从1开始的,所以需要减1
    }

    // 将修改后的内容写回文件
    for (std::vector<std::string>::const_iterator it = lines.begin(); it != lines.end(); ++it) {
        const std::string& line = *it;
        outfile << line << '\n';
    }

    outfile.close(); // 关闭输出文件流
}

int main() {
    modifyDataInLine("file.txt", 3, "New Data"); // 将"New Data"修改为文件file.txt的第三行数据
    return 0;
}

至于可以正确使用这段代码的编辑器或环境,任何支持较新C++标准的编译器和开发环境都可以。具体要依赖于你使用的编译器和版本。常用的编译器例如GCC、Clang、Visual Studio等都支持较新的C++标准。


9🐜要使用ofstreamchar*类型数据修改到file.txt文件的指定行,你可以按照以下步骤进行操作:

  1. 打开文件进行读取和写入操作。
  2. 读取文件内容并存储到一个字符数组中。
  3. 修改指定行的数据。
  4. 将修改后的内容写回文件。
  5. 关闭文件流。

以下是一个示例代码:❎

#include <fstream>  
#include <iostream>  
#include <cstring>  
  
void modifyDataInLine(const std::string& filePath, int lineNumber, const char* data) {  
    std::ifstream infile(filePath); // 打开文件进行读取  
    std::ofstream outfile(filePath, std::ios::out | std::ios::in); // 打开文件进行写入和读取  
  
    char line[256]; // 假设每行不超过256个字符  
    int currentLineNumber = 1;  
  
    // 读取文件内容并存储到lines中  
    while (infile.getline(line, sizeof(line))) {  
        if (currentLineNumber == lineNumber) {  
            outfile << data; // 写入新的数据到指定行  
        } else {  
            outfile << line; // 写入原行数据  
        }  
        outfile << '\n'; // 写入换行符  
        currentLineNumber++; // 更新当前行号  
    }  
  
    infile.close(); // 关闭输入文件流  
    outfile.close(); // 关闭输出文件流  
}  
  
int main() {  
    const char* newData = "New Data";  
    modifyDataInLine("file.txt", 3, newData); // 将"New Data"修改为文件file.txt的第三行数据  
    return 0;  
}

这段代码将打开名为file.txt的文件,读取其内容,并将第三行的数据修改为"New Data"。然后,它将修改后的内容写回文件并关闭文件流。请确保在运行代码之前替换实际的文件路径和行号。

9🐜经过检查,发现DevC++ 5.11中没有直接支持使用std::string作为参数的std::ifstream构造函数。这可能是导致第5行报错的原因。为了解决这个问题,您可以尝试使用C风格的字符串作为参数,或者使用c_str()函数将std::string转换为C风格的字符串。修改后代码如下:

#include <fstream>  
#include <iostream>  
#include <cstring>  
  
void modifyDataInLine(const char* filePath, int lineNumber, const char* data) {
    std::ifstream infile(filePath); // 打开文件进行读取  
    std::ofstream outfile(filePath, std::ios::out | std::ios::in); // 打开文件进行写入和读取

    char line[256]; // 假设每行不超过256个字符  
    int currentLineNumber = 1;  
  
    // 读取文件内容并存储到lines中  
    while (infile.getline(line, sizeof(line))) {  
        if (currentLineNumber == lineNumber) {  
            outfile << data; // 写入新的数据到指定行  
        } else {  
            outfile << line; // 写入原行数据  
        }  
        outfile << '\n'; // 写入换行符  
        currentLineNumber++; // 更新当前行号  
    }  
  
    infile.close(); // 关闭输入文件流  
    outfile.close(); // 关闭输出文件流  
}  
  
int main() {
    const char* filePath = "file.txt"; // 使用C风格的字符串
    const char* newData = "New Data";
    modifyDataInLine(filePath, 3, newData);
    return 0;
}

现在,我们将文件路径作为C风格的字符串传递给std::ifstream构造函数,应该可以成功编译和运行了。

附录:

使用using namespace std的优点:

  1. 简洁明了:using namespace std 允许你直接使用标准库中的名称,省略了每次都要写 std:: 的繁琐过程,使代码更加简洁明了。
  2. 减少代码冗余:不需要在每处使用标准库类和函数时都写上 std:: 前缀,减少了代码的冗余性。

使用using namespace std的缺点:

  1. 命名冲突:如果你的代码还有其他命名空间或者引入了其他库,可能会发生名称冲突,导致编译错误。
  2. 可读性下降:当代码变得复杂时,由于没有显式指定名称空间,可能会导致代码可读性下降,不容易确定某个标识符来自哪个命名空间。

每次写 std::

每次写 std:: 的优点:

  1. 避免命名冲突:通过显式地写 std::,可以避免与其他命名空间或库发生命名冲突,确保使用的是正确的标识符。
  2. 代码清晰明了:在代码中每次写上 std:: 前缀,可以明确表明使用的是标准库的成员,增强代码的可读性。
  3. 避免意外引入:显式写出 std:: 可以避免意外引入标准库以外的成员,提高代码的可维护性。

每次写 std:: 的缺点:

  1. 代码冗余:在每次使用标准库的类和函数时都要写上 std:: 前缀,会导致代码冗余,增加了代码的长度。
  2. 不够简洁:相比于使用 using namespace std,需要每次写 std::,代码看起来较为冗长。
综上所述,使用 using namespace std 可以使代码更加简洁,并且对于小型项目或者简单的程序而言,方便快捷。但是对于大型项目或者需要与其他库进行交互的程序,最好使用每次写 std::,以避免命名冲突和提高代码的可读性。选择使用哪种方式取决于你正在开发的项目的规模、复杂程度和个人团队的偏好。
  • 22
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值