こんにちは私はフォーマットの文字でファイルから読み取るこのプログラムを持っています
#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 ()
何が得られないのか...