2012-12-26 41 views
-2

我想從stdin輸入文本,然後在屏幕上顯示它,同時爲行編號。我的程序的最後一部分無法正常工作,我不知道如何正確使用read()函數。所有的如何使用C中讀取的函數顯示文件中的內容?

#include <stdio.h> 
#include <stdlib.h> 
#include <fcntl.h> 
#include <io.h> 
#include <string.h> 

int main() 
{ 
    char s[201]; 
    int i=0, f = open("text.dat", O_RDWR | O_CREAT | O_TRUNC); 
    while (fgets(s,200,stdin) != NULL) 
     write(f,s,strlen(s)); 
    char *buf; 
    while (read(f,buf,200) > 0) 
     printf("%d %s", i++, *buf); 
    close(f); 
    return 0; 
} 
+0

它是如何 「不工作」? – StoryTeller

+0

我得到一個奇怪的輸出,很難形容。 –

+1

不要描述輸出。將其粘貼到問題中。 –

回答

2

首先你消耗stdin

while (fgets(s,200,stdin) != NULL) 
    write(f,s,strlen(s)); 

然後嘗試從文件f閱讀。但是,文件f已在其末尾,因此第一次撥打read()時會返回0。由於沒有什麼可讀的。您需要將文件指針移回文件的開頭。

但是你的基於read()的循環將不會做你想要的。這是因爲你需要面向行的輸入。所以你應該使用fgets而不是read。就像您以面向行的方式處理stdin一樣,您需要處理您的打印至stdout

而且Mats指出,你從來沒有分配buf。所以如果有什麼要讀的話,你會去引用一個未初始化的指針。

說了這麼多之後,我覺得只運行一個循環會更有意義。在調用write()的循環內呼叫printf()

while (fgets(s,200,stdin) != NULL) 
{ 
    write(f,s,strlen(s)); 
    printf("%d %s", i, s); 
    i++; 
} 
+2

'f'是從'open()'而不是'fopen()'獲得的。因此,'fseek()'可能在沒有'fdopen()'的情況下不起作用。 – timrau

+0

我應該只使用低級文件處理函數,這就是爲什麼我不使用fopen。 –

0

怪異輸出:我會認爲這部分將崩潰相當嚴重:

char *buf; 
while (read(f,buf,200) > 0) 
    printf("%d %s", i++, *buf); 

BUF未初始化任何東西,因此,點「那邊」(中「無處有用的大方向「)。這會導致Linux/Unix系統中的SIGSEGV(「分段錯誤」),我期望。你在DOS下沒有任何機會使用Turbo/Borland C - 這是唯一可以想象這不會崩潰的場景。 Windows不會說SIGSEGV,但它仍然不允許你的代碼工作。

當然,您可能因爲您處於文件末尾而無法讀取任何內容。

也許你的意思是這樣的:

char buf[200]; 
while (read(f,buf,200) > 0) .... 
相關問題