0

1024 バイトのランダム データのファイルを作成しようとしています。これを実行すると、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;
}
4

1 に答える 1

9

openFILE *ポインターではなく、ファイル記述子を返します。使用fopen:

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

脇:その(void *)キャストはどうですか?それはあなたからバグを隠しています。精神的なデバッグは、「代入はキャストなしで整数からポインターを作成します」という警告を取り除くためにキャストを挿入したことを教えてくれますが、この場合、それは正しい修正ではありません。そのような奇妙な警告が表示された場合は、クレイジーなキャストをすべて意地悪に挿入することに頼る前に、ドキュメントを確認する必要があります。

余談 2: プログラムはファイルにデータを書き込みませんtest.txt。実際、とにかく作成したファイル記述子をすぐにリークするため、現在は何も書き込めません。から読み込もうとしている 1024 バイトを書き込めたとしても/dev/urandom、それはテキスト データにはならないので、そのファイル拡張子は少し変です。

creat()余談 3:そもそもなぜ使用しているのですか? そのマニュアルページには、「このインターフェースは廃止されました」とはっきりと書かれていますopen(2)

于 2013-03-11T04:55:49.687 に答える