2013-03-11 202 views
0

试图创建一个1024字节的随机数据文件。当我运行这个时,我得到了fread线上的分段错误错误。任何人看到我做错了什么?谢谢!fread导致段错误

#include <stdio.h> 
#include <fcntl.h> 
#include <unistd.h> 
#include <stdlib.h> 

#define PERMS 0666 

int main() { 

    char buf[1024]; 

    if (creat("test.txt", PERMS) < 0) { 
     fprintf(stderr, "couldn't create file\n"); 
     exit(0); 
    } 

    char randomData[1024]; 
    FILE* fp; 
    fp = (void*) open("/dev/urandom", O_RDONLY, PERMS); 
    fprintf(stderr, "here\n"); 
    fread(&randomData, 1024, 1, fp); 
    fclose(fp); 

    return 0; 
} 
+3

真正的问题是,为什么你将'open'的返回值赋给'void *'?那应该有一个闪烁的警告,告诉你你在做什么是不正确的。 – 2013-03-11 04:58:09

+0

@ usr55410 - 如果你采取行动,通常是检查你在做什么的好主意。 'fp =(void *)...'这行会表明你做错了什么。 – 2013-03-11 04:58:51

+0

谢谢。我已经尝试过无论是否有这个问题。看起来我在这篇文章中留下了错误的尝试。 – Alex 2013-03-11 05:00:19

回答

9

open返回文件描述符而不是FILE *指针。使用fopen

fp = fopen("/dev/urandom", "r"); 

旁白:这是怎么回事与(void *)投?它隐藏了你的bug。心理调试告诉我,你插入了转换来摆脱“赋值使得整型指针没有转换”的警告,但这不是正确的解决方案。当你得到这样的奇怪警告时,你应该在诉诸插入疯狂的演员之前查看文档。

另外2:您的程序不会将任何数据写入您的test.txt文件。其实你泄露你创建的文件描述符无论如何,所以它目前不能写什么。即使您设法通过/dev/urandom来读取1024字节,但它不会是文本数据,因此文件扩展名有点奇怪。

另外3:为什么你首先使用creat()?它的man page很清楚地说“这个接口被open(2)过时了”。

+2

+1为了解决真正的问题:-) – 2013-03-11 04:57:15