繁体   English   中英

使用 fstream 将数据写入和读取二进制文件

[英]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但这会破坏文件的任何现有内容。

顺便说一句,不需要重复的seekgseekp 您只需设置一次位置即可更改模式。

暂无
暂无

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

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