2012-10-29 204 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,並自己解析內容。