2014-02-12 72 views
0

我在C中有下列程序,用於將UNIX文本文件轉換爲Windows格式(LF-> CR LF)。基本上使用目的是addcr infile > outfile在命令行:在C打印垃圾中添加回車工具?

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
int main(int argc, char *argv[]) 
{ 
    FILE *fp; 
    char *buffer; 
    int i, flen; 
    if(argc<2) 
    { 
     printf("Usage: addcr filename\n"); 
     return 0; 
    } 
    fp=fopen(argv[1], "r"); 
    if(fp==NULL) 
    { 
     printf("Couldn't open %s.\n", argv[1]); 
     return 0; 
    } 
    fseek(fp, 0, SEEK_END); 
    flen=ftell(fp); 
    rewind(fp); 
    buffer=(char*)malloc(flen+1); 
    fread(buffer, 1, flen, fp); 
    fclose(fp); 
    buffer[flen]=0; 
    for(i=0;i < strlen(buffer);i++) 
    { 
     if(buffer[i]==0x10) 
     { 
      printf("%c", '\r'); 
     } 
     printf("%c", buffer[i]); 
    } 

    free(buffer); 
    return 0; 
} 

然而,有時它打印出垃圾在文件內容的結束時,通過它的輸出進行比較來TYPE命令所指示的:

C:\Temp>addcr sample.txt 
He did not wear his scarlet coat, 
       For blood and wine are red, 
       And blood and wine were on his hands 
       When they found him with the dead, 
       The poor dead woman whom he loved, 
       And murdered in her bed. 
Window 
C:\Temp>type sample.txt 
He did not wear his scarlet coat, 
       For blood and wine are red, 
       And blood and wine were on his hands 
       When they found him with the dead, 
       The poor dead woman whom he loved, 
       And murdered in her bed. 

C:\Temp> 

它似乎有時在我的環境變量中打印出一些不可預知的字符串部分。我完全不知道可能導致它的原因。有誰知道如何解決這個問題?

回答

1

我認爲這裏發生的事情是,輸入文件已經有CRLF行分隔符,並且你已經在文本模式下打開它。接下來會發生的情況是使用fread,並將其轉換爲換行符('\n')。

由於您首先要求輸入文件大小,這比您讀入的翻譯文本的長度長6個字節。這意味着在終止位置flen處的緩衝區之前,最後6個字節未初始化。

fread實際上會返回讀取的字節數。你應該注意這個價值。

size_t bytes_read = fread(buffer, 1, flen, fp); 

試試吧。輸出值bytes_read和值flen。我敢打賭他們是不同的。此外,你真的不必終止你的緩衝區,並使用strlen來獲得長度。這實際上很難看。你已經知道了這個長度 - 這是bytes_read。所以在你的循環中使用它。

如果你想避免這種混淆,你應該以二進制模式打開文件 - "rb",而不是"r"

+0

謝謝! :)現在得到它的工作。 –

1

由於stdout在文本模式下工作,如果您在Windows操作系統上運行此操作,您不應該明確寫入'\r'。它會自動將'\ n'翻譯成'\r' '\n'(並按照正確的順序進行!)。

-1

buffer最後沒有\ 0,所以strlen(buffer)將繼續計數,直到碰巧找到一個\ 0 - 因此它將返回比buffer的實際長度略多的值。

+0

我有行緩衝區[flen] = 0;在我打電話給strlen之前。 (「\ 0」的ASCII值爲0)。 但是,按照@ paddy的帖子中的建議,我已經確定並解決了實際問題。 –

+1

...是的,我錯過了。我現在感到很蠢。 – immibis