[英]Writing and reading data to binary file using fstream
我需要创建一个二进制文件并在其中存储 10 个数字,然后逐个执行文件元素并将其替换为相反的数字。
#include <iostream>
#include <fstream>
int main() {
std::fstream file("numbers.dat", std::ios::app | std::ios::in|std::ios::out|std::ios::binary);
for (double i = 1; i <= 10; i++)
file.write(reinterpret_cast<char*>(&i), sizeof i);
int length_of_file = file.tellg();
int number_of_elements = length_of_file / sizeof(double);
for (int i = 0; i < number_of_elements; i++) {
double num;
file.seekg(0); // change mode to reading
file.seekg(i * sizeof (double));
file.read(reinterpret_cast<char*>(&num), sizeof num);
num = num * -1;
file.seekp(0); // change mode to writing
file.seekp(i * sizeof (double));
file.write(reinterpret_cast<char*>(&num), sizeof num);
}
// after change
file.seekg(0, std::ios::end); // position cursor to the end
length_of_file = file.tellg();
number_of_elements = length_of_file / sizeof(double);
for (int i = 0; i < number_of_elements; i++) {
double num;
file.seekg(i * sizeof (double));
file.read(reinterpret_cast<char*>(&num), sizeof num);
std::cout << num << " ";
}
return 0;
}
输出:1 2 3 4 5 6 7 8 9 10 -1 -2 -3 -4 -5 -6 -7 -8 -9 -10
如果我在运行程序之前不使用std::ios::app
并创建一个空文件numbers.dat ,我会得到正确的输出:
-1 -2 -3 -4 -5 -6 -7 -8 -9 -10
std::ios::app根据 cpp 参考意味着在每次写入之前寻找流的末尾
有什么方法可以创建一个文件,其模式会在每次写入之前寻找到流的开头?
有没有办法在运行程序之前不创建空文件来解决这个问题?
您的模式在两个方面是错误的。 首先std::ios::app | std::ios::binary
std::ios::app | std::ios::binary
不允许您从文件中读取,其次这意味着所有写入都将在文件末尾,而与当前位置无关。
您看到的-1
文件位置意味着seekg
调用失败,可能是因为您尝试从未使用std::ios::in
打开的文件中读取。
你应该使用std::ios::in | std::ios::out | std::ios::binary
std::ios::in | std::ios::out | std::ios::binary
std::ios::in | std::ios::out | std::ios::binary
虽然这要求文件在打开之前存在,或者您可以使用std::ios::in | std::ios::out | std::ios::trunc | std::ios::binary
std::ios::in | std::ios::out | std::ios::trunc | std::ios::binary
std::ios::in | std::ios::out | std::ios::trunc | std::ios::binary
但这会破坏文件的任何现有内容。
顺便说一句,不需要重复的seekg
和seekp
。 您只需设置一次位置即可更改模式。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.