0

假设你有一个文件 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) 会怎样?您将如何打印每条“行”?

4

3 回答 3

0

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

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

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

您可以通过包含“b”标志以二进制模式打开文件,例如

FILE *fp = fopen("dog.txt", "rb");

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

n = fread(buffer, sizeof(char), BUFFER_SIZE, source);
于 2012-10-29T01:32:35.507 回答
0

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

于 2012-10-29T01:33:05.053 回答
0

这是 WhozCraig 已删除答案的精简版

如果您只想将输入文件中的数据转储到标准输出,用换行符替换任何嵌入的空字符 (0),那么就这样做。对于这个问题的简单性来说,预读缓冲确实有点过头了,此外,fopen/fread/etc.. 系列已经为你缓冲了。

注意:这完全假设OP 指定的内容,否则这是一个常规的“文本”文件,除了嵌入的空字符(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;
}
于 2013-05-18T06:55:39.027 回答