2

文字通り1時間前はこのコードは正常に機能していましたが、現在は機能していないため、これは私にとって非常に魅力的なエラーです。

基本的に何が起こっているのかというと、次の行の最初の「ブロック」の最初の文字が最後の「ブロック」の最後の文字として追加されているということです。

これにより、「ブロック」とは、その行/列内に保持されている文字列を意味します。

たとえば、配列が次のようなものであると想定されているとします。

1,2,3,Hello
4,5,6,Wonder

として読み込まれています

1,2,3,Hello4,
6,Wonder, , 

これが私が使用しているロジックです。何が変わったのか本当にわからないので、どんなアドバイスでもいいでしょう。

tableFile = fopen(argv[4], "r");


//pulling the table data from the file
char tableArray[30][50][256];
char c;
int i=0, j=0, k=0;
while(c != EOF){

    c = fgetc(tableFile);

    switch(c)
    {
        case ',':
            tableArray[i][j++][k]='\0';
            k=0;
            break;
        case '\n':
            tableArray[i++][j][k]='\0';
            j=0;
            k=0;
            break;
        case '\r':
            break;
        case EOF:
            break;
        default:
            tableArray[i][j][k++] = c;
            break;
    }

} //end file transfer

//Just to display, ignore magic numbers as (mostly) irrelevant
int a, b;

for (a = 0; a < 20; a++)
{
    for (b = 0; b < 47; b++)
    {
        printf ("%s", tableArray[a][b]);
        if (b<46)
            printf (", ");

    }
    printf ("\n");
}

fclose(tableFile);
4

2 に答える 2

1
  1. アレイを初期化していません。ゼロが埋められることを保証するものではありません。追加

    memset(tableArray, 0, sizeof(tableArray))

  2. case EOF:NULL最新の文字列にターミネータを追加する必要があります。

于 2012-10-02T18:39:31.773 に答える
0

これは、私の元の投稿のすぐ下にあるコメントによるものです。しかし、それが嫌で貧弱なコーディング形式であるのと同じように...これは一貫してそれを解決したものであり、私がそれを誇りに思っているわけではありません...そしてまだアイデアにオープンです:

tableFile = fopen(argv[4], "r");

//pulling the table data from the file, lazy magic numbers here... 
char tableArray[30][50][256];
char c;
int i=0, j=0, k=0;

memset(tableArray, 0, sizeof(tableArray));
while(c != EOF){

    c = fgetc(tableFile);

    switch(c)
    {
        case ',':
            tableArray[i][j++][k]='\0';
            k=0;
            break;
        case '\n':
            tableArray[i++][j][k]='\0';
            j=0;
            k=0;
            break;
        case '\r':
            tableArray[i++][j][k]='\0';
            j=0;
            k=0;
            break;
        case EOF:
            tableArray[i][j][k] = '\0';
            break;
        default:
            tableArray[i][j][k++] = c;
            break;
    }

} //end file transfer

/* //Only relevant for displaying the tableArray
int a, b;

for (a = 0; a < 20; a++)
{
    for (b = 0; b < 47; b++)
    {
        printf ("%s", tableArray[a][b]);
        if (b<46)
            printf (", ");

    }
    printf ("\n");
}
 */

fclose(tableFile);
于 2012-10-03T00:08:07.577 に答える