1

文字のファイルを 64 文字の配列に読み込もうとしています。ファイルの読み取りはmain()

int main (int argc, char **argv)
{
    FILE *fp;
    char write_msg[BUFFER_SIZE];

    fp = fopen("test.data", "r");

    int i;
    for ( i = 0; i < (BUFFER_SIZE-1); i++){
      fscanf(fp, "%s\n", &write_msg[i]);
      printf ("printing in the for loop");
    }
    fclose(fp);
    printf("Starting the main().\n");
    printf("in Reader, the msg is: %s\n",write_msg);

    pid_t pid;
    int fd[2];

セグ フォールトが頻繁に発生し、何をしているのかわかりません

4

3 に答える 3

1

fscanf(fp, "%s\n", &write_msg[i]);fscanf(fp, "%c\n", &write_msg[i]);文字列を char にスキャンしたくありません。

また、write_msg は '\0' で終わる必要があります。write_msg[BUFFER_SIZE-1]=0

于 2012-10-01T05:10:09.120 に答える
0

コードに次の問題があります。

fscanf(fp, "%s\n", &write_msg[i]);

ループ内を移動している位置 i から始まる文字列を読み取ろうとしています。文字列 write_msg 用に予約されたメモリの最後に到達すると、セグメンテーション フォールトが発生しやすくなります。

別の推奨事項: fp 記述子に検証を入れます。

fp = fopen("test.data", "r");
if ( fp == NULL ) {
    /* Show an error and exit */
}

何らかの理由でファイルを読み取れなかった場合、fp は NULL になり、セグメンテーション違反が発生します。

于 2012-10-01T05:11:18.447 に答える
0

読み取られる文字数を制限せずに、かなり長い可能性のある文字列をバッファーにスキャンしています。あなたはそれをすべきではありません。i文字列がはるかに長い場合でも、1ずつインクリメントします。fgetsファイル全体をバッファに読み込むには、またはを使用するfread必要があります。これは、 の特別な機能は実際には必要なくfscanf、これらの関数は読み取るのに文字数を必要とするためです。または、 for ループが本当に気に入っている場合はfgetc、 を使用できますfscanf

于 2012-10-01T05:12:46.557 に答える