【发布时间】:2015-04-16 09:32:21
【问题描述】:
假设您有一个名为“input.txt”的文件,如下所示:
5
0 0 0 0 0
0 0 0 0 0
0 1 1 1 0
0 0 0 0 0
0 0 0 0 0
上面有一个 5 x 5 的网格。您想将 5 x 5 网格存储到二维 C 数组中。我的问题是将文件读入该网格。
这是我的 C 文件,它读取数据,将其存储在二维 整数 数组中并输出其内容
int main (int argc){
FILE *fp;
char ch;
int **C; //Our 2D Array
char filenamein[] = "input.txt";
fp = fopen(filenamein,"r");
N = (ch = fgetc(fp)) - 48;
//Initialize Grid, set all cells to 0
C = malloc(N * sizeof(int *));
for (i = 0; i < N; i++) {
C[i] = malloc(N * sizeof(int));
}
for (i=0;i<N;i++) {
for (j=0;j<N;j++) {
C[i][j]=0;
}
}
//Read array, store into array
while ((ch = fgetc(fp) ) != EOF)
{
for (i=0;i<N;i++){
for (j=0;j<N;j++){
C[i][j] = ch - 48;
}
}
}
//Print 2D Array:
for (i = 0; i < N; i++) {
for (j = 0; j < N; j++)
printf("%d ", C[i][j]);
printf("\n");
}
fclose(fp);
}
调用这个我得到:
-38 -38 -38 -38 -38
-38 -38 -38 -38 -38
-38 -38 -38 -38 -38
-38 -38 -38 -38 -38
-38 -38 -38 -38 -38
网格从我扣除的内容中输出 Whitespace/NULL 的 char-to-decimal ASCII 代码,因此我的问题是将文本文件读入数组。
如何读取文本文件以将数字存储到数组中?
【问题讨论】:
-
你为什么使用
fgetc而不是fscanf?当您使用 fgetc 时,您会读取空白字符,因此您需要在网格构建部分忽略它们。 -
使用
fgetc()并将ASCII 值转换为数字几乎没有什么好处。磁盘访问是这里的瓶颈,而不是字符转换。只需使用scanf()将数据输入为十进制数。 (另外,fgetc()返回一个整数,所以while ((ch = fgetc(fp) ) != EOF)可能会发生灾难性的失败。) -
你的网格初始化部分也有一个错误,你每次都用新的读取字符填充你的所有网格。
-
不要堆积,而是当你减去一个 ASCII 值时,让编译器完成工作。
C[i][j] = ch - 48;应该是C[i][j] = ch - '0'; -
@ParhamAlvani 如果我将 fgetc 与 'fscanf(ch,"%d")' 交换并将 ch 更改为整数,然后删除 (-48) 我什么也得不到输出