2012-10-29 205 views
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)?你将如何打印每个“行”?

+0

是的,'iostream'只在C++上可用。没有看到C标签,对不起。如果有人想知道如何用C++解决这个问题,我会在这里发布它:ifstream fp(“dog.txt”); while(fp.getline(buf,10,'\ 0')){...}'。 – Shoe

回答

0

这是 WhozCraig’s 修剪下来的版本删除了答案

如果你想要做的是从输入文件到标准输出转储数据,用换行符替换任何嵌入的空字符(0),那么就去做。预读缓冲,这对于这个问题的简单性来说实在是太过于夸张了,此外,fopen/fread/etc等系列已经为你缓冲。

注:这是假定指定什么OP 正好中,这是否则reagular“文本”文件保存为嵌入空字符(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; 
} 
0

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

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

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

您可以通过添加“b”标志来打开二进制文件。

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

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

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

如果除了不寻常的行终止符之外,文件中还有二进制文件,则还需要映射不可打印的字符。如果没有映射它们,当数据看起来像控制字符等时,打印到屏幕可能会导致各种奇怪的事情发生。 while(fgets)成语在空字符上断开,因为返回的字符(null)变成循环的不需要的终止(当数据为空时,条件变为false)。无论如何,while(!EOF)或类似的是谨慎的循环。 – chris

+0

请注意,sizeof(char)的定义是1。所以只要使用1. –

+1

@WilliamMorris:是的,但我更喜欢在解释某些东西时不使用“魔术常数”。 –

0

“文本”文件处理和任何其它文件处理之间的区别在于,“文本”功能假定某些事情(例如,\ n是一个分离器)。如果你不是这种情况,你显然不能使用“文本”操作功能。你做fread,并自己解析内容。