如何读取包含'\ 0'字符的文件?

时间:2014-01-05 19:04:46

标签: c++ c buffer fopen

我写了一个简单的程序来读取TXT文件。问题是该文件包含一些'\ 0'字符。这是一个示例:

enter image description here

这是我找到解决问题的解决方案:

FILE *pInput = fopen("Encoded.txt", "rb");

    fseek(pInput, 0, SEEK_END);
    size_t size = ftell(pInput);
    fseek(pInput, 0, SEEK_SET);

    char *buffer = new char[size];

    for (int i = 0; i < size; i++)
        buffer[i] = fgetc(pInput);

我想替换以下代码:

for (int i = 0; i < size; i++)
        buffer[i] = fgetc(pInput);

只需一个简单的函数调用。有没有可以完成这项工作的功能? 我尝试了fread,fgets但他们停下来读第一个'\ 0'字符。

非常感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

fread可以读取任意二进制文件;它返回读取的元素数,这是您应该存储并在缓冲区的所有交易中使用的值。 (阅读fread上的一些文档,了解它是如何工作的。)

(另一方面,使用fgets,您将无法找出读取了多少个字符,因为指向[假定为空终止的] C字符串的指针就是您从中获取的全部内容。)

您需要确保所得缓冲区的处理是零安全的。这意味着没有strlen或类似的东西,它们都设计用于ASCII输入(或多或少)。

答案 1 :(得分:0)

引用cplusplus.com并删除您在链接中找到的管道工程:

  // Open the file with the pointer at the end
  ifstream file("example.bin", ios::in|ios::binary|ios::ate); 

  // Get the file size
  streampos size = file.tellg();

  // Allocate a block
  char* memblock = new char [size];

  // We were at the end go to the begining
  file.seekg 0, ios::beg);

  // Read the whole file
  file.read(memblock, size);

Etvoilà!