0

次のような形式の行区切りのテキスト ファイルからロードするコードに問題があります。

aa
bb
dd
ccasdf
dfdsafefasd
vdasfeadsaf
cvdasegfdjasflfe
swedtd

配列に対しては、テキスト ファイルに含まれていたすべてのものを含む配列で終了したいだけです...これが私のコードです。

#include<stdio.h>
#include<string.h>


int main()
{
    int size = 0;
    char peeps[10000][50];
    FILE *people = fopen("test.txt","r");
    while(fscanf(people,"%s",peeps[size]) != EOF)
{
    size++;
}
fclose(people);
return 0;
}

実行すると、segfault が発生します。gdb が吐き出すものを調べましたが、修正方法がわかりません... gdp が出力するものは次のとおりです。

Program received signal SIGSEGV, Segmentation fault.
_IO_vfscanf_internal (s=s@entry=0x804a008, format=format@entry=0x804865f "%s",     argptr=argptr@entry=0xbff85298 "4X\305I", 
    errp=errp@entry=0x0) at vfscanf.c:1073
1073                  *str++ = c;
(gdb) bt
#0  _IO_vfscanf_internal (s=s@entry=0x804a008, format=format@entry=0x804865f "%s", 
    argptr=argptr@entry=0xbff85298 "4X\305I", errp=errp@entry=0x0) at vfscanf.c:1073
#1  0xb7e5564d in __isoc99_fscanf (stream=0x804a008, format=0x804865f "%s") at     isoc99_fscanf.c:35
#2  0x08048581 in main () at fdsa.c:10

誰が何がうまくいかないのか知っていますか?

4

2 に答える 2

2

誰が何がうまくいかないのか知っていますか?

I. 3 つの連続するクエスチョン マーク。

Ⅱ.scanf(people,"%s",peeps[size]) != EOF)-ファイルをメモリに読み込むことだけが必要な場合は、絶対に使用scanf()しないでください。

III. intサイズには使用しないでください。を使用してくださいsize_t。標準ライブラリにあるのには十分な理由があります。

FILE *f = fopen("foo.txt", "r");
size_t total_size = 0;
size_t num_bytes = 0;

char buf[0x1000];
char *result = NULL;

while ((num_bytes = fread(buf, 1, sizeof(buf), f)) > 0) {
    char *p = realloc(result, total_size + num_bytes);
    if (p == NULL) {
        fclose(f);
        free(result);
        abort(); // whatever, out of memory
    }

    result = p;
    memcpy(result + total_size, buf, num_bytes);
    total_size += num_bytes;
}

fclose(f);

もう少し効率的にしたい場合は、動的バッファの対数展開を実装してください。

于 2013-04-13T05:13:54.803 に答える
1

テストを から!= EOFに変更してみてください> 0

標準 (好奇心のために、ドラフト N1256 の §7.19.6.2 ¶16) には、次のように記載されています。

変換前に入力エラーが発生した場合、関数はマクロのfscanf値を返します。EOFそれ以外の場合、関数は割り当てられた入力項目の数を返します。初期の一致が失敗した場合は、指定された数より少ないか、0 になることもあります。

あなたの C 標準ライブラリは EOF をエラー状態として解釈していないのではないかと思われますEOF

標準の例はすべて、ファイルの終わりをチェックするために戻り値をチェックするのではなく、feofand を使用していることに注意してください。ferrorfscanf

于 2013-04-13T05:13:56.907 に答える