[英]Should I read and write from the same file?
根据从同一个文件中读取和写入? ,如果我使用 2 个流(一个输入和其他输出)来读取和写入文件,我必须在打开输入一个进行读取之前刷新 output 一个。
但是假设我正在写一个录音机。 我可能想把 go 放回某个点来玩。 然后刷新文件以读取它,可能不是最好的做法。
如果我不打开std::ifstream
和std::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
模式。 此外,您需要in
和out
模式(用于读取和写入)。 由于您正在处理二进制数据(不是文本),因此请以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.