我想读取包含4X4矩阵数据的文本文件,每个元素用空格分隔,它被分成4行代表矩阵。它是以下面的形式
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
现在我遇到了代码
static const char filename[] = "file.txt";
FILE *file = fopen ( filename, "r" );
if ( file != NULL )
{
char line [ 128 ]; /* or other suitable maximum line size */
while ( fgets ( line, sizeof line, file ) != NULL ) /* read a line */
{
fputs ( line, stdout ); /* write the line */
}
fclose ( file );
}
else
{
perror ( filename ); /* why didn't the file open? */
}
return 0;
读取文件但我想知道如何以元素方式读取它们以便我可以将它们存储在2D数组中
答案 0 :(得分:2)
保持行数和列数。更改while循环的内部
line = 0;
column = 0;
while ( fgets ( line, sizeof line, file ) != NULL ) /* read a line */
{
// fputs ( line, stdout ); /* write the line */
<FOR EVERY VALUE IN LINE>
{
matrix[line][column] = <VALUE>;
column++;
if (column == 4) {
column = 0;
line++;
}
}
}
至于&lt; FOR EVERY VALUE IN LINE&gt;我会想到strtok()
- 或者您可以使用is*
中声明的<ctype.h>
函数。
如果您完全信任输入,sscanf()
也是一个不错的选择。
答案 1 :(得分:1)
您可以使用fscanf
功能。
#include <stdio.h>
int main ()
{
FILE* file;
int array[4][4];
int y;
int x;
file = fopen("matrix.txt","r");
for(y = 0; y < 4; y++) {
for(x = 0; x < 4; x++) {
fscanf(file, "%d", &(array[x][y]));
}
fscanf(file, "\n");
}
fclose (file);
for(y = 0; y < 4; y++) {
for(x = 0; x < 4; x++) {
printf("%d ", array[x][y]);
}
printf("\n");
}
return 0;
}
注意:在生产代码中,您应该检查fopen
的返回值(可能是NULL
),以及fscanf
的返回值(它是否读取了预期的元素数量) ?)。
答案 2 :(得分:1)
fscanf救援:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
int main()
{
FILE* file = fopen("input.txt", "r");
if (!file)
perror("Can't open input");
int matrix[4][4] = {
{ 0, 0, 0, 0, },
{ 0, 0, 0, 0, },
{ 0, 0, 0, 0, },
{ 0, 0, 0, 0, },
};
int i;
for (i=0; i<4; i++)
{
int n = fscanf(file, "%i %i %i %i", &matrix[i][0],
&matrix[i][1],
&matrix[i][2],
&matrix[i][3]);
if (n != 4) {
if (errno != 0)
perror("scanf");
else
fprintf(stderr, "No matching characters\n");
}
}
for (i=0; i<4; i++)
printf("%i %i %i %i\n", matrix[i][0],
matrix[i][1],
matrix[i][2],
matrix[i][3]);
}
当然,您需要使代码更通用