-1

コードの座標値を含むファイルを読み込もうとしています。

私の質問は、ファイルへの将来の追加を含めるのに十分な大きさの配列サイズを作成するにはどうすればよいですか?

以下は私のコードです。配列のサイズを 905 に設定すると、スペースがいっぱいになるまでループが続きます。何故ですか?

FILE.txt:

S (60,70)(200,200)
S (30,40)(100,200)
S (10,20)(80,10)
S (60,400)(700,200)
S (160,70)(240,20)
S (160,70)(240,20)
S (160,70)(240,20)

私のコード:

#include <stdio.h>
int a;
int b;
int c;
int d;
int data[905][4];
int main ( int argc, char *argv[] )
{
    if ( argc != 2 ) /* argc should be 2 for correct execution */
    {
        /* We print argv[0] assuming it is the program name */
        printf( "usage: %s filename", argv[0] );
    }
    else 
    {
        // We assume argv[1] is a filename to open
        FILE *file = fopen( argv[1], "r" );

        /* fopen returns 0, the NULL pointer, on failure */
        if ( file == 0 )
        {
            printf( "Could not open file\n" );
        }
        else 
        {
            int j=0;int count=1
            for (j=0; j < count; j++) 
            {    
                fscanf(file, "S (%d,%d)(%d,%d)", &a, &b, &c, &d);

                printf("%d,%d,%d,%d\n",a, b, c, d);
                count++
            }             

            fclose( file );
        }
    }
}
4

2 に答える 2

1

int j=0;int count=1
for (j=0; j < count; j++) 
{

     fscanf(file, "S (%d,%d)(%d,%d)", &a, &b, &c, &d);

     printf("%d,%d,%d,%d\n",a, b, c, d);
     count++
}

オーバーフローして未定義の動作が発生するまでcount1 より大きい値を保持するループがあります。コンパイラは、未定義の動作が発生しないと想定する可能性があるため、ループ制御を省略して無限ループにする可能性があります。jcount++

したがって、ループはファイルから値を際限なく、または少なくとも非常に長い時間読み取ろうとします。ファイルの終わりに達したとき、fscanf値は読み取られませんが、戻り値をチェックしないため、ループは停止しません。それを避けるために、次のようなことができます

if (fscanf(file, "S (%d,%d)(%d,%d)", &a, &b, &c, &d) < 4) {
    break;
}

ファイルの終わりに達したとき、または何らかの入力エラーが発生したときにループが終了するようにします。

それにかんする

ファイルへの将来の追加を含めるのに十分な大きさの配列サイズを作成するにはどうすればよいですか?

次に、静的に定義された次元を持つ配列を使用しないでください。malloc

int (*data)[4] = malloc(num_rows * sizeof *data);

さらに必要な場合は、

int (*temp)[4] = realloc(data, new_num_rows * sizeof *data);
if (temp == NULL) {
    // reallocation failed, handle it or exit
} else {
    data = temp;
}

reallocメモリのより大きなチャンク。

于 2012-09-22T21:01:44.627 に答える
1

mallocこれにはとrealloc関数を使用する必要があります<stdlib.h>。基本的な考え方は、事前に一定量のスペースを割り当て、十分な大きさがないとわかったときに配列を拡大することです。

配列の配列ではなく構造体の配列を使用すると、作業が楽になります。

struct segment { int x0, y0, x1, y1; };

そして、あなたはこのようなことをします:

size_t nsegs = 0, segs_allocated = 10;
struct segment *segs = malloc(segs_allocated * sizeof(struct segment));
if (!segs) abort();

while (getline(&line, &linesz, stdin) >= 0)
{
    if (!parse_line(&segs[nsegs], line)) continue;
    nsegs++;
    if (nsegs == segs_allocated)
    {
        segs_allocated *= 2;
        segs = realloc(segs, segs_allocated * sizeof(struct segment));
        if (!segs) abort();
     }
}

必須の接線コメント: について聞いたことは忘れてくださいfscanf。それは価値があるよりもはるかに面倒です。で行全体を読み取りgetline(持っていなくても実装は難しくありません)、ハンドコーディングされたパーサーで行から個々の数値文字列を抽出し、必要に応じてstrtolstrtoul、またはでそれらを機械整数に変換しstrtodます。

于 2012-09-22T21:03:22.980 に答える