std::getline 和 std::fstream

std::getline with std::fstream

我正在使用 std::fstream 读取和写入同一个文件。我可以看到写入发生,但看不到读取。

网上查了下才知道不能同时设置in和app模式。所以,摆脱它并使不传递任何参数变得非常简单。

我很想知道读取没有发生的原因。

此外,人们如何使用相同的 fstream 读取和写入相同的文件?

我的代码:

#include<iostream>
#include<fstream>

int main() {
  std::fstream* fs = new std::fstream("xx.txt");
  *fs << "Hello" << std::endl;
  (*fs).close(); // ?

  std::string line;
  while(std::getline(*fs, line)) {
    std::cout << line << std::endl;
  }
}

使用此代码,我可以 xx.txt 包含 "Hello" 作为其内容,但它根本不会进入 while 循环,说明读取失败。

我该如何克服这个问题?

您忘记重新打开流。实际上你不能在两个方向(同时)打开一个流。
所以步骤是:

  • 打开流进行写入
  • 写入数据
  • 关闭流
  • 重新打开流以供阅读
  • 读取数据
  • 关闭它(可选)

您的示例可以重写为:

#include <fstream>
#include <iostream>

int main()
{
    const std::string file_path("xx.txt");

    std::fstream fs(file_path, std::fstream::app);
    if(fs) // Check if the opening has not failed
    {
        fs << "Hello" << std::endl;
        fs.close();
    }

    fs.open(file_path, std::fstream::in);
    if(fs) // Check if the opening has not failed
    {
        std::string line;
        while(std::getline(fs, line))
        {
            std::cout << line << std::endl;
        }
        fs.close();
    }

    return 0;
}

请注意,最好在尝试使用流之前检查流是否已成功打开。

我会尽力解释这个问题。

语句 std::fstream* fs = new std::fstream("xx.txt"); 将打开文件,如果它存在于默认模式 "in|out" 。 如果该文件不存在,那么从构造函数 std::fstream 内部打开的调用将失败。这可以通过使用函数 fail() 检查 failbit 来检查。因此,您将明确需要调用 'open' 以使用 fstream 对象进行数据输入。注意:除非您调用 'close'.

,否则不会创建新文件

您可以通过实际尝试打开现有文件或新文件来进行测试,您可以看到不同之处。

所以或者你应该做的是总是调用 'open' 这在两种情况下都有效(如果文件存在或不存在)。

#include<iostream>
#include<fstream>


int main() {
    //std::fstream fs("xx.txt");
    //std::cout << fs.fail() << std::endl; // print if file open failed or passed
    std::fstream fs;  
    fs.open("xx.txt", std::fstream::in | std::fstream::out | std::fstream::app);
    std::cout << fs.fail() << std::endl;
    fs << "Hello" << std::endl;

    if (fs.is_open())
    {   
        std::cout << "Operation successfully performed\n";
        fs.close();
    }
    else
    {   
        std::cout << "Error opening file";
    }

要阅读文件内容,您首先需要关闭文件。然后重新打开阅读。据我了解,一旦您开始使用对象 fs 进行插入,您就无法读取它,除非您明确关闭它并重新打开。

    fs.open("xx.txt", std::fstream::in | std::fstream::out);
    std::string line;
    while(std::getline(fs, line)) {
        std::cout << line << std::endl;
    }
    std::cout << "end" << std::endl;
    fs.close();
}