0

somedata.dat という名前のデータ ファイルがあり、数値のペアのリストが含まれています。約10000ペア。このような:

3 19
5 213
1 34
7 93

ファイルを開いて読み取り、数値を 10000x2 の配列に入れようとしました。しかし、以下のコードでは80000回目くらいでループが止まってしまいます(言うまでもなくEOF)。何か案は?ありがとう。

int main(int argc, char *argv[])
{

int data[10000][2];
FILE *fp;

char s[5];
char temp[2];
char cur;
char next;
int pid=0;
int k=0;

fp = fopen("c:\\somedata.dat","r");
while (!EOF)
{
    cur = fgetc(fp);
    if (cur==' ')
    {           
        data[pid][0]=atoi(s);
        memset(&s[0], 0, sizeof(s));
    }
    else if (cur=='\n')
    {
        data[pid][1]=atoi(s);
        pid++;
        memset(&s[0], 0, sizeof(s));
    }
    else
    {
        temp[0]=cur;
        temp[1]='\0';
        strcat(s,temp);
    }
}
4

3 に答える 3

1

編集:

20,000の配列を定義し、約10,000のパリを追加しようとすると、80,000で停止しますか?

ループに中断がないため、10,000を読み取り、次にEOFを70,000回読み取り、配列に奇妙な処理を実行します。その後、終了します。


あなたは何かと比較EOFしなければなりません。

通常:

int c; /* Has to be int, not char */

while((c = fgetc(fh)) != EOF) {

   ...
}

また; stdio.hのfscanfを見てください。おそらくあなたの使用法により適しています。


同じように; charまたはEOFとして表現可能な1つおよび1つのintfgetc()を取得します。

すなわちファイル:

12 33
16 693

次に、fgetcは以下を取得します。

1: '1'
2: '2'
3: ' '
4: '3'
5: '3'
6: '\n'
7: '1'
8: '6'
...

さらに:関数を使用するときを確認してください。fgetc()がEOFを返す場合は、EOFである、読み取りエラーが発生しています。フェラーなどで確認してください。


于 2012-04-04T07:40:09.840 に答える
0

配列を確立して保存できます。ただし、malloc を使用する方が理にかなっています。皆さんありがとう。

于 2012-04-10T16:14:57.253 に答える
0

あなたが書いた:

while (k!=80000)

80.000で停止する理由かもしれません

于 2012-04-04T07:28:57.840 に答える