如何逐个整数读取文件并将它们放入二维数组中?
How can I read a file integer by integer and put them into a 2D array?
我正在尝试从一个 txt 文件中读取所有数字并将它们放入一个二维数组中。我不应该担心大小和内容,因为我知道它将被输入 9 行并且每行将有 9 个数字。但是,如果我 运行 这段代码,我会得到以下输出。
int main() {
FILE *fpointer = fopen("filename.txt", "r");
int ch;
int arr[9][9];
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
ch = fgetc(fpointer);
arr[i][j] = ch;
//printf("%d", ch);
}
}
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
printf("%d ", arr[i][j]);
}
printf("\n");
}
fclose(fpointer);
return 0;
}
输出:
49 51 52 53 54 55 48 57 50
10 52 50 49 57 56 51 55 52
49 10 51 49 50 52 57 56 55
49 51 10 52 50 51 53 49 51
53 49 49 10 50 51 52 54 51
53 55 50 49 10 53 50 51 54
55 56 50 52 53 10 54 52 54
53 56 57 51 50 49 10 53 52
57 50 57 56 51 53 54 10 50
但是输入的数字是:
134567092
421983741
312498713
423513511
234635721
523678245
646589321
549298356
234698721
我假设它可能必须用 fgets()
函数做一些事情,但我尝试使用 getw()
,但我得到的数字更糟。也许它试图以十六进制或其他方式读取文件。有什么想法吗?
我不完全确定您在这里希望的行为是什么,但我建议在将数字存储到数组中之前对 ASCII 数字进行解码,如下所示:
arr[i][j] = ch - '0';
另外,请注意 fgetc
将 return 行结束字节,如 10,因为这些也是您文件中的字符,即使它们并不完全可见。因此,当您收到其中一个时,您需要丢弃它并再次调用 fgetc
。或者您可以在每行的末尾插入一个额外的 fgetc
调用(就在您的 j
循环之后)以阅读这些内容。
看来您需要将 char 从数字的 ascii 表示形式转换为实际数字。另见:Convert a character digit to the corresponding integer in C
所以这部分:
for(int j =0; j<9;j++){
ch = fgetc(fpointer);
arr[i][j] = ch;
//printf("%d", ch);
}
会变成这样:
for(int j =0; j<9;j++){
ch = fgetc(fpointer);
if(isdigit(ch)) {
ch = ch - '0';
} else {
printf("error: Non-digit found!\n");
exit(1);
}
arr[i][j] = ch;
//printf("%d", ch);
}
我正在尝试从一个 txt 文件中读取所有数字并将它们放入一个二维数组中。我不应该担心大小和内容,因为我知道它将被输入 9 行并且每行将有 9 个数字。但是,如果我 运行 这段代码,我会得到以下输出。
int main() {
FILE *fpointer = fopen("filename.txt", "r");
int ch;
int arr[9][9];
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
ch = fgetc(fpointer);
arr[i][j] = ch;
//printf("%d", ch);
}
}
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
printf("%d ", arr[i][j]);
}
printf("\n");
}
fclose(fpointer);
return 0;
}
输出:
49 51 52 53 54 55 48 57 50
10 52 50 49 57 56 51 55 52
49 10 51 49 50 52 57 56 55
49 51 10 52 50 51 53 49 51
53 49 49 10 50 51 52 54 51
53 55 50 49 10 53 50 51 54
55 56 50 52 53 10 54 52 54
53 56 57 51 50 49 10 53 52
57 50 57 56 51 53 54 10 50
但是输入的数字是:
134567092
421983741
312498713
423513511
234635721
523678245
646589321
549298356
234698721
我假设它可能必须用 fgets()
函数做一些事情,但我尝试使用 getw()
,但我得到的数字更糟。也许它试图以十六进制或其他方式读取文件。有什么想法吗?
我不完全确定您在这里希望的行为是什么,但我建议在将数字存储到数组中之前对 ASCII 数字进行解码,如下所示:
arr[i][j] = ch - '0';
另外,请注意 fgetc
将 return 行结束字节,如 10,因为这些也是您文件中的字符,即使它们并不完全可见。因此,当您收到其中一个时,您需要丢弃它并再次调用 fgetc
。或者您可以在每行的末尾插入一个额外的 fgetc
调用(就在您的 j
循环之后)以阅读这些内容。
看来您需要将 char 从数字的 ascii 表示形式转换为实际数字。另见:Convert a character digit to the corresponding integer in C
所以这部分:
for(int j =0; j<9;j++){
ch = fgetc(fpointer);
arr[i][j] = ch;
//printf("%d", ch);
}
会变成这样:
for(int j =0; j<9;j++){
ch = fgetc(fpointer);
if(isdigit(ch)) {
ch = ch - '0';
} else {
printf("error: Non-digit found!\n");
exit(1);
}
arr[i][j] = ch;
//printf("%d", ch);
}