打印二进制文件

时间:2012-10-29 01:29:11

标签: c

假设你有一个文件dog.txt

The
quick
brown
fox
jumps
over
the
lazy
dog

您可以打印这样的行

#include <stdio.h>
int 
main (void)
{
  char buf[10];
  FILE *fp = fopen ("dog.txt", "r");
  while (fgets (buf, sizeof buf, fp))
    printf ("%s", buf);
  return 0;
}

但是如果每个“行”用空字符(\0)而不是换行符(\n)分隔怎么办?你会如何打印每一条“线”?

3 个答案:

答案 0 :(得分:0)

如果文件不是文本文件(即,如果文件包含不可打印的ASCII字符),请将其视为二进制文件。

不是一次读取“一行”(这是一个文本文件概念),而是一次读入一个缓冲区(例如每次1024个字符)。

输出您一次读取的每个字符,除非您遇到文件使用的任何行分隔符(例如问题中的“空”字符)。遇到该字符时,请输出换行符。

通过包含“b”标志,例如

,以二进制模式打开文件
FILE *fp = fopen("dog.txt", "rb");

使用fread一次读取一个缓冲区的数据。

n = fread(buffer, sizeof(char), BUFFER_SIZE, source);

答案 1 :(得分:0)

“文本”文件处理和任何其他文件处理之间的区别在于“文本”函数假定某些事物(例如,\ n是分隔符)。如果你不是这种情况,你显然不能使用“文本”操作函数。您执行fread,并自行解析内容。

答案 2 :(得分:0)

这是一个精简版 WhozCraig’s 删除的答案

如果您要做的只是将数据从输入文件转储到stdout,用换行替换任何嵌入的null-chars(0),那么就这样做。预读缓冲,这样对于这个问题的简单性实在是太过分了,而且,fopen / fread / etc ..系列已经为你缓冲了。

注意:这假设完全 OP指定的内容,否则这是一个反复的“文本”文件,除了奇怪的是嵌入的null-chars(0)应该被视为新行输出流:

#include <stdio.h>
#include <errno.h>

int main(int argc, char* argv[])
{
    FILE *fp = NULL;        
    fp = fopen(argv[1], "rb");        
    do
    {   // pull next char, break on EOF, subst '\n' on 0.
        int ch = fgetc(fp);
        if (EOF == ch)
            break;
        if (0 == ch)
            ch = '\n';
        fputc(ch, stdout);
    } while (true);

    fclose(fp);
    return EXIT_SUCCESS;
}