2011-05-24 66 views
3

我正在做一個程序,從標準輸入在文件中讀取,做了它,並將它發送到stdout。閱讀一般的文件

既然這樣,我在我的程序行:

while((c = getchar()) != EOF){ 

其中c是一個int。

但是問題是我想使用ELF可執行此程序。它似乎有必須是代表可執行文件,這會導致它被截斷(糾正我,如果我錯了這裏 - 這只是我的假設)內ASCII文件EOF字節。

什麼是去這樣做有效一般方式?我可以挖掘ELF格式的文件,然後檢查最後發生的情況。這將是有用的,但我認爲如果我仍然可以將此程序應用於任何類型的文件會更好。

+2

你的假設是錯誤的。這是讀取流的標準方式。 – 2011-05-24 16:22:17

+0

你爲什麼要使用stdin?這意味着你會做prog <文件。使用prog文件然後自己讀取文件有什麼問題?可執行文件將包含各種值,而不僅僅是ASCII。 – ColWhi 2011-05-24 17:07:15

+0

@Sasquiha Eh?也許他想寫一個過濾器。這就是UNIX命令應該工作的方式。 – 2011-05-24 17:19:41

回答

3

你會好的 - EOF常數不包含有效的ASCII值(通常爲-1)。

例如,下面是從stdio.h我的系統上的摘錄:

/* End of file character. 
    Some things throughout the library rely on this being -1. */ 
#ifndef EOF 
# define EOF (-1) 
#endif 
1

你可能想要去一個低一點的水平,並使用系統功能,如打開(),close()方法和read() ,這樣你可以對輸入做你喜歡的事情,因爲它會被存儲在你自己的緩衝區中。

0

從的getchar(3)手冊頁:

字符值返回爲轉換爲int的 無符號字符。

這意味着,通過getchar讀取的字符值不能等於-1的帶符號整數。這個小程序解釋它:

int main(void) 
{ 
     int a; 
     unsigned char c = EOF; 

     a = (int)c; 
     //output: 000000ff - 000000ff - ffffffff 
     printf("%08x - %08x - %08x\n", a, c, -1); 
     return 0; 
} 
1

你正確地做到了這一點。

EOF不是字符。有沒有辦法c將EOF代表流中的任何字節。如果/當c確實包含EOF時,該特定值不是源自文件本身,而是源自底層庫/ OS。 EOF是出現問題的信號。

確保cint雖然

哦......你可能希望從你的操控下一個流中讀取。在沒有其他代碼的情況下,stdin受到「文本翻譯」的影響,這在讀取二進制數據時可能不合意。

FILE *mystream = fopen(filename, "rb"); 
if (mystream) { 
    /* use fgetc() instead of getchar() */ 
    while((c = fgetc(mystream)) != EOF) { 
     /* ... */ 
    } 
    fclose(mystream); 
} else { 
    /* error */ 
}