2014-11-05 88 views
2

我有一個基本的程序,打開一個文件包含在C文件所在的目錄中(以root用戶)。該文件被稱爲myfile1,它是一個包含文本的簡單文件。C Unix程序不會讀取文件

該程序應該打開該文件,計算字符數並顯示它。出於某種原因,我編譯程序,運行a.out,程序從用戶處獲得輸入,並在時按下Ctrl + D,此時應該從文件中獲取輸入。

關於可能發生什麼的任何想法?非常感謝你,這裏是我到目前爲止有:

#include <fcntl.h> 
void main(){ 
char buff[512]; 
int fd = 0; 
int j=0; 
long total=0; 

if(fd=open("myfile1",O_RDONLY)<0){ 
    printf("Error"); 
    return 1; 
} 
while((j=read(fd,buff,512))>0) 
    total = total+j; 
printf("%d\n",total); 
close(fd); 
return 0; 

} 
+0

no'#include '?它編譯? 'void main()'和'return 0'? – 2014-11-05 06:09:06

+0

是的我編譯它在Unix環境中使用gcc timeBuff.c,它給了我a.out文件 – JohnnyBoy 2014-11-05 06:10:21

+1

你應該用'gcc -Wall -Wextra -g timeBuff編譯。c -o mytest',你應該在失敗時使用'perror'。您缺少幾個'#include' -s – 2014-11-05 06:21:12

回答

6

問題是與您的if條件:fd=open("myfile1",O_RDONLY)<0。少於比較的優先級高於分配的優先級。它應該是(fd=open("myfile1",O_RDONLY))<0

+0

因此,自open()調用並返回0以來,'fd'被賦值爲「false」或0。0恰好是stdin的文件描述符。 – UncleO 2014-11-05 06:20:25

+0

你是對的。我修好了這部分,它工作!非常感謝你 – JohnnyBoy 2014-11-05 06:22:07

1

在您的代碼中,正如ketlat所說,if邏輯是有問題的。

如果你把你的代碼裏面調試打印並檢查fd,你會看到

代碼:

if(fd=open("myfile1",O_RDONLY)<0){ 
    printf("Error"); 
    return 1; 
} 
printf("obtained fd = %d\n", fd); 

O/P:

獲得FD = 0

原因

<=有更高的先驗性。因此,當open()成功時,它將返回一個不小於0的非負值,並且比較open("myfile1",O_RDONLY)<0將評估爲false,表示爲0,同樣將指定給fd

Nw,這fd值將用於您的read()調用。 FD 0表示stdin或標準輸入。所以,根據你的邏輯,代碼的行爲是正確的。

然而,爲了實現自己的目標,你需要改變

fd=open("myfile1",O_RDONLY)<0 

(fd=open("myfile1",O_RDONLY))<0 

有了改變的代碼,一個樣品運行很可能會產生一個O/P像

獲得fd = 3。

被通知,YMMV。