假设你有一个文件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
)分隔怎么办?你会如何打印每一条“线”?
答案 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;
}