我需要创建一个二进制文件并在其中存储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
不允许您从文件中读取,其次,它意味着所有的写入将在文件的末尾,而不管当前位置。
你看到的-1
文件位置意味着seekg
调用失败了,大概是因为你试图从一个你没有用std::ios::in
打开的文件中读取。
您应该使用std::ios::in | std::ios::out | std::ios::binary
,尽管这要求在打开它之前文件已经存在,或者您可以使用std::ios::in | std::ios::out | std::ios::trunc | std::ios::binary
但是这将破坏文件中所有现有的内容。
顺便说一句,重复的seekg
和seekp
不需要。只需设置一次位置即可切换模式。