2013-03-11 210 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