我正在学习C,但是我在练习时遇到了问题。我需要用文件的信息填充以零开头的矩阵。该文件包含一些坐标,我需要将包含文件的数字放入矩阵中,但要放在文件给我的坐标的前一行中。
例如,如果我有此文件:
2,3 4 3 1
3,1 3 2 2
1,4 1 2 8
我需要我的最终矩阵看起来像这样:
0 0 0 1 2 8
0 0 4 3 1 0
3 2 2 0 0 0
0 0 0 0 0 0
我的代码:(仅打开文件并创建矩阵,因为我正在寻找信息或示例,但找不到任何有用的东西)
#include <stdio.h>
int main(){
FILE *data;
data = fopen("example.txt","r");
if (data == NULL)
{
printf("\nERROR\n");
return -1;
}
int row = 4;
int col = 6;
int matrix[row][col];
for (int x = 0; x < row; ++x)
{
for (int y = 0; y < col; ++y)
{
matrix[x][y]=0;
}
}
fclose(data);
for (int x = 0; x < row; ++x)
{
for (int y = 0; y < col; ++y)
{
printf("[%d]",matrix[x][y]);
}
printf("\n");
}
return 0;
}
答案 0 :(得分:0)
尝试一下
#include <stdio.h>
#include <stdlib.h>
int main()
{
char string[99];
FILE *data;
int row = 4;
int col = 6;
int y=0;
int matrix[row][col];
int matrixrow,position, s1 , s2 , s3 ;
for (int x = 0; x < row; ++x)
{
for (int y = 0; y < col; ++y)
{
matrix[x][y]=0;
}
}
data=fopen("example.txt" ,"r");
while( fgets( string , 10 , data))
{
// each row we expect int comma int space int space int space int space
// first int is row , int after comma is position , next 3 ints are data to stuff at position
matrixrow =(string[0]- '0')-1; // substract 0 to get int
position=(string[2]- '0')-2;
s1=string[4]- '0';
s2=string[6]- '0';
s3=string[8]- '0';
matrix[matrixrow][position+1]=s1;
matrix[matrixrow][position+2]=s2;
matrix[matrixrow][position+3]=s3;
printf("\n\nfrom text file matrix");
printf("\n%s", string);
printf("\noutput");
printf("[%d]", matrixrow);
for( y=0 ; y<col-1 ; y++)
printf("[%d]", matrix[matrixrow][y]);
}
printf("\n\nPrint whole matrix\n" );
for (int x = 0; x < row; ++x)
{
for (int y = 0; y < col; ++y)
{
printf("[%d]",matrix[x][y]);
}
printf("\n");
}
fclose(data);
}
答案 1 :(得分:0)
有很多方法可以做到这一点。如果您知道每行有2个坐标和3个值,那么处理每一行的读取和解析数据的最简单,最可靠的方法之一就是使用{{1}将每一行读入缓冲区},然后使用fgets
将线解析为各个坐标。 1 虽然您可以通过一次调用sscanf
来完成相同的操作,使用fscanf
进行读取可确保您每次都消耗整行数据,并可以独立验证您(1)从文件中读取的数据; (2)将数据解析为您的坐标和值。
然后,您只需要通过减去fgets
将坐标映射到有效的C索引(请记住C中的数组是基于基于零的而不是一基),请检查以确保您的坐标有效,以使从索引处开始写入3个值不会超出数组范围,最后,将3个值循环写入{{1 }}行从1
索引开始。
一个简单的实现可以是:
x
示例输入文件
y
使用/输出示例
#include <stdio.h>
#define NVAL 3 /* if you need a constant, #define one (or more) */
#define ROW 4
#define COL 6
#define MAXC 1024
int main (int argc, char **argv) {
char buf[MAXC]; /* buffer to hold each line read with fgets */
int matrix[ROW][COL] = {{0}}; /* 2D array initialized all zero */
/* use filename provided as 1st argument (stdin by default) */
FILE *fp = argc > 1 ? fopen (argv[1], "r") : stdin;
if (!fp) { /* validate file open for reading */
perror ("file open failed");
return 1;
}
while (fgets (buf, MAXC, fp)) { /* read each line into buf */
int x, y, data[NVAL] = {0}; /* declare coords/data vars */
if (sscanf (buf, "%d,%d %d %d %d", /* parse line into values */
&x, &y, &data[0], &data[1], &data[2]) != 5) {
fputs ("error: invalid line format.\n", stderr);
continue; /* skip to next line on error */
}
x = x - 1; /* convert coords to zero based index for C */
y = y - 1;
if (x < ROW && y <= COL - NVAL) { /* check valid indexes */
for (int i = 0; i < NVAL; i++) /* loop over each value */
matrix[x][y++] = data[i]; /* write numbers to array */
}
}
if (fp != stdin) fclose (fp); /* close file if not stdin */
for (int i = 0; i < ROW; i++) { /* loop over rows */
for (int j = 0; j < COL; j++) /* loop over cols */
printf ("%2d", matrix[i][j]); /* outputting values */
putchar ('\n'); /* tidy up with newline */
}
return 0;
}
仔细检查一下,如果还有其他问题,请告诉我。
脚注:
1。。注意:$ cat dat/matcoords.txt
2,3 4 3 1
3,1 3 2 2
1,4 1 2 8
系列产品均不提供成功/失败以外的任何错误报告功能。要获得用于数字转换的细粒度错误报告,请使用$ ./bin/matrix_data_at_coords <dat/matcoords.txt
0 0 0 1 2 8
0 0 4 3 1 0
3 2 2 0 0 0
0 0 0 0 0 0
系列函数(例如scanf
)