2016-11-07 44 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");