如何用C中的文件信息完成矩阵?

时间:2019-01-25 04:42:10

标签: c

我正在学习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;
}

2 个答案:

答案 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