繁体   English   中英

我应该从同一个文件中读取和写入吗?

[英]Should I read and write from the same file?

根据从同一个文件中读取和写入? ,如果我使用 2 个流(一个输入和其他输出)来读取和写入文件,我必须在打开输入一个进行读取之前刷新 output 一个。

但是假设我正在写一个录音机。 我可能想把 go 放回某个点来玩。 然后刷新文件以读取它,可能不是最好的做法。

如果我不打开std::ifstreamstd::ofstream ,而是打开一个std::fstream怎么办? 我可以同时写/读吗? 我应该怎么办?

目前,我尝试写入并刷新到一个文件,然后从该文件中读取,但我读取了 0 个字节。

更新:

这是一个例子:

#include <iostream>
#include <fstream>
#include <vector>
using namespace std;

int main()
{
    std::fstream f;
    f.open("hello.txt");
    std::vector<char> v;
    v.push_back(0);
    v.push_back(1);
    v.push_back(1);
    v.push_back(1);
    v.push_back(1);
    f.write(v.data(), v.size());
    f.flush();
    f.seekg(0);
    std::vector<char> v2(v.size());
    f.read(v2.data(), v2.size());
    if (f) {
        
    } else {
        std::cout << "did read: " << f.gcount() << std::endl;
    }
    auto* b = v2.data();
    for (int i=0; i<v2.size(); i++) {
        std::cout << b[i] << std::endl;
    }
    
    return 0;
}

是的, std::fstream支持使用同一个文件 stream object 进行读写。 由于您最初没有显示您的代码,我只能猜测您没有正确设置文件 position 指针。 使用seekg()seekp()时,请记住,在文件流的情况下,它们都引用相同的 position 指针。 (对于std::stringstream ,这些是不同的,但对于std::fstream则不然。)

要创建文件(而不是仅仅打开现有文件),您需要指定trunc模式。 此外,您需要inout模式(用于读取和写入)。 由于您正在处理二进制数据(不是文本),因此请以binary模式打开文件。 换句话说,做f.open("hello.txt", std::ios_base::binary | std::ios_base::trunc | std::ios_base::in | std::ios_base::out); .

此外,在打印文件内容时,您需要将b[i]强制转换为 integer,因为std::cout中用于char参数的<<运算符重载将尝试打印字符,而不是其数值。 换句话说,做std::cout << static_cast<int>(b[i]) << '\n'; .

您遇到的主要问题是这两行:

std::fstream f;
f.open("hello.txt");

不要像您期望的那样创建新文件。 默认情况下, std::fstream::open的参数为:

void open (const char* filename,
       ios_base::openmode mode = ios_base::in | ios_base::out);

由于ios_base::in标志,文件必须存在; 否则操作将失败并设置fstream的失败位。 如果您这样编写代码:

std::fstream f;
f.open("hello.txt");

if (f) 
{
 ...
}

您会发现if语句的计算结果为 false,因为流的故障位已设置。 可以使用std::fstream来读取和写入文件,但是如果文件不存在,则必须指定首先创建该文件。

要创建一个文件以在不存在的情况下进行读/写并销毁其内容,您还需要指定std::fstream::trunc标志:

f.open("hello.txt", std::fstream::in | std::fstream::out | std::fstream::trunc);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM