【问题标题】:How can a .txt file be converted to binary file (.dat) with C++ and fstream? [closed]如何使用 C++ 和 fstream 将 .txt 文件转换为二进制文件 (.dat)? [关闭]
【发布时间】:2012-05-25 20:00:32
【问题描述】:

我正在尝试编写一个简单的程序来测试用户使用键盘的效率(现在只是每分钟字数和准确性),但我在文件操作部分遇到了困难。我想要一个存储在 .txt 文件中的单词列表(以便于编辑),如下所示:

    cheese
    computer
    photograph
    download
    etc...

我希望能够将 .txt 文件作为一个整体转换为二进制文件,每个单词都进入 .dat 文件中的一个条目,但我很难弄清楚 fstream 如何从.txt 文件。使用 fstream 从列表中读取单词以便将它们添加到二进制文件中的条目中的最简单方法是什么?

【问题讨论】:

  • .dat(或“二进制文件”)不是特定格式——您需要更具体地了解您需要的格式。
  • 您认为二进制文件和文本开头的区别是什么?
  • 我说的是使用 fstream 类时使用的 ios::binary 模式。我想我的问题更多的是如何使用 ifstream 对象读取文本文件(就像你用记事本制作的普通文件一样)。
  • ios::binary 避免换行转换。而已。读取文本文件并将其“作为二进制”写回只会给您留下'\n' 行尾,而不是适合操作系统的行尾。文本仍然是数据,所有数据都是二进制的。
  • 我想我现在明白了。我想我仍然对如何使用 fstream 将文本文件实际读入程序感到困惑。

标签: c++ text binaryfiles fstream


【解决方案1】:

就像黄昏说的那样,扩展没有任何意义。文件以 ASCII 格式或二进制格式存储。

如果文件是 ASCII 文件,则每个字节都存储为其 ASCII 等效项。二进制文件只是原始数据,无需任何转换即可存储。就您的问题而言,您可以执行以下操作:

  1. 像往常一样读取输入文件 (ASCII)
  2. 使用 fwrite 将其写回不同的文件

【讨论】:

  • 文件是二进制的。这取决于相互渗透。
  • "每个字节都存储为其 ASCII 等价物" 什么??
  • 好的,但是我如何读取带有 fstream 对象的文本文件呢?这更多的是我不明白该怎么做。
【解决方案2】:

从 fstream 读取实际上非常简单。 «getline» 读取每一行,直到«fstream.is_good» 返回«false»。也看看tutorials at cplusplus.com。应该这样做:

#include <fstream>
#include <iostream>
#include <string>

using namespace std;

int main() {
  fstream myfile;
  string line;
  myfile.open("sample.txt");
  if  ( myfile.is_open() ) {
    while ( myfile.good() ) {
      getline( myfile, line);
      // conversion and output function goes here
      // this example just prints it to stdout
      cout << line << endl;
    }
    myfile.close();
  } else {
    cerr << "could not open file" << endl;
  }
  return 0; 
}

【讨论】:

  • -1 while ( myfile.good() ) 永远不会正确。让while ( getline( myfile, line) ).
猜你喜欢
  • 1970-01-01
  • 2020-02-10
  • 2014-08-25
  • 1970-01-01
  • 2016-08-31
  • 2017-09-12
  • 1970-01-01
  • 1970-01-01
  • 2021-06-27
相关资源
最近更新 更多