2016-11-07 42 views
-7

我有一個包含文本abcdefgh意外的值讀取

這個代碼轉換文件描述符(int fd)文件指針(FILE*)的文件y.txt,並試圖從中讀取數據。

#include <stdio.h> 
#include<fcntl.h> 
int main() 
{ 
    FILE *fp; 
    int fd = open("y.txt",O_RDONLY); 

    printf("%d",fd); 
    fp=fdopen(fd,"r"); 
    close(fd); 
    char a[5]; 
    a[4]='\0'; 
    fread(a,2,1,fp); 
    printf("%s",a); 
    return 0; 
} 

該程序輸出p代替ab,因爲它應該,如果它是從y.txt開始時讀取。

我在做什麼錯?

+3

請閱讀簡單[問]頁面。 –

+0

好吧我知道它是一個壞的,我真的很抱歉,但請清楚,爲什麼當我將fd轉換爲文件指針時,爲什麼它沒有給我正確的答案。它給了我p但y.txt包含:abcdefg –

+0

也許嘗試['fopen'](https://linux.die.net/man/3/fopen)而不是'open' /'fdopen' – yano

回答

2

我看到您的代碼存在問題。您在fp之前完成close(fd),這可能會導致您致電fread的呼叫失敗。這是因爲當您使用fdopen時:

文件描述符未被複制。

這意味着當您運行close(fd)時,fp試圖讀取的底層文件會被關閉。要解決此問題,您可以刪除對close的呼叫,並添加對fclose的呼叫,該呼叫也應該關閉fd

如果你真的只想要一個FILE *你應該只能用fopen打開它,跳過fd一起。

0

考慮您的代碼:

char a[5]; 
a[4]='\0'; 
fread(a,2,1,fp); 

這給你一個5字符串。它是一個「自動」變量,並未初始化。然後你用'\0'終止字符串。好。然後你得到一個大小爲2的項目。所以字節3和4仍然是垃圾。這有幫助嗎?

0

下面是對該程序的一些更正,如代碼中所評論的。

#include <stdio.h> 
#include <io.h>       // added header 
#include <fcntl.h> 

int main() 
{ 
    FILE *fp; 
    int fd = open("y.txt",O_RDONLY); 

    printf("%d\n",fd);     // add a newline for clarity 
    fp=fdopen(fd,"r"); 
    //close(fd);      // do not close before reading! 
    char a[5]; 
    a[4]='\0'; 
    fread(a,4,1,fp);     // read 4 chars to fill the string space 
    printf("%s\n",a);     // add a newline for clarity 
    close(fd);       // close after reading 

    return 0; 
} 

文件輸入:

abcde 

程序輸出:

3 
abcd 

雖然這將是擺在首位最好是有

FILE *fp = fopen("y.txt", "r");