0

こんにちは私はフォーマットの文字でファイルから読み取るこのプログラムを持っています

#00
000
000

しかし、改行までfgetcで行を読んだ場合、文字数を出力すると4としてカウントされますが、3(0-3)である必要があります。なぜこれが起こったのですか?

#include <stdio.h>
#include <stdlib.h>

int
main(void)
{
    //int row, col; BEFORE.
    int row=0, col=0; //UPDATE
    /* check controls that read columns are the same size  */
    int check=0, i;
    FILE * file;
    char c;
    char **matrix;
    matrix = malloc(sizeof *matrix * 4);
    for (i = 0; i < 4; i++)
        matrix[i] = malloc(sizeof *matrix[i] * 4);
    file=fopen("map.map", "r");
    while ((c = fgetc(file)) != EOF)
    {
        matrix[row][col]=c;
        if (matrix[row][col]=='\n')
        {
            if(row==0)
               check=col;
            printf("%d\n", check);
            row++;
            if(check!=col)
               return -1;
            check=col;
            col=0;
        }
        else 
            col++;
     }
     fclose(file);
     printf("%d \n", check);
     return 0;
}

アップデート

私はプログラムをデバッグし、charsでファイルを読み取るfgetcを発見しました

#00
000
000

は最初に「\0」を読み取り、次に「#00 ...」を読み取り始めます。したがって、問題を修正するには、この文字をバッファから削除する必要があります。次に、コメントのように、列の終わりは「/r」と後で「/n」(システム:Mac OS X Lion 10.7.4)を読み取るので、それを覚えておく必要があります。

新しいバージョン

#include <stdio.h>
#include <stdlib.h>

int
main(void)
{
    int row=0, col=0;
    /* check controls that read columns are the same size  */
    int linelen=0, i;
    FILE * file;
    char c;
    char matrix[3][3];
    file=fopen("map.map", "r");
    /* have to read the first char because its a '\0' in the beginning */
    c=fgetc(file);
    if(c!=EOF)
    {
        while ((c=fgetc(file)) != EOF)
        {
            /* to jump over '\r' thats from old systems */
            if(c!='\r' || c!='\n')
            {
                matrix[row][col]=c;
                col++;
            }
            if(c=='\n')
            {
                /* first time definition of line length */
                if(row==0)
                    linelen=col;
                printf("%d\n", linelen);
                row++;
                if(linelen!=col)
                    return -1;
                col=0;
            }
        }
    }
    else
        printf("El archivo esta vacio\n");
    fclose(file);
    printf("%d\n", linelen);
    printf("%d, %d\n", row, col);
    return 0;
}

このプログラムをデバッグすると、Imが不良メモリにアクセスしていると表示されます。

バグレポート:

.....
.....
Breakpoint 1, main () at mapaprearmado.c:25
25          while ((c=fgetc(file)) != EOF)
(gdb) print c 
$25 = 13 '\r'
(gdb) print row
$26 = 1
(gdb) print col
$27 = 4
(gdb) step
.....
.....
(gdb) step
Cannot access memory at address 0x0
0x0000000100000714 in start ()

何が得られないのか...

4

1 に答える 1

3

これが Windows スタイルのテキスト ファイルである場合、問題は \r が \n の前にあるという単純なものである可能性があります。

Mac では \r を使用し、nix では \n を使用し、Windows では \r\n を使用して可能な限り相互互換性を保つという歴史的なことがあります。したがって、行末は実際には 2 文字です。変更してみてください:

if (matrix[row][col]=='\n')

為に

if ((matrix[row][col]=='\r') || (matrix[row][col]=='\n'))

これはすべてのプラットフォームで機能するはずですが、改行の後に来る \r または \n をスキップする必要がありますが、必要に応じて複数の改行を検出するには、少し考える必要があります...

于 2012-11-09T17:14:28.373 に答える