从C中的矩阵中删除分号

时间:2018-01-27 18:59:09

标签: c parsing matrix strtok

我正在尝试在矩阵中编辑分号,我将其作为输入文件接收,而我似乎无法取得任何进展。我在main中使用while循环来确定矩阵的尺寸,因为程序需要能够处理不同大小的矩阵。我知道它永远是一个方阵。我认为我的问题出在read_file函数中。我可以从文件中读取矩阵并将其打印到终端但我无法删除分号。我尝试了几种不同的方式,包括strtok,但我总是得到垃圾数据。以下代码将在输入文件和printf中读取到终端而没有错误或警告,但它包含我需要删除的分号。这是我的代码:

void read_file(int *rows_p, int *columns_p, char matrix[*rows_p][*rows_p], char *file[]){

    FILE *file_in;
    file_in = fopen(file[1], "r");

    /*Please not that the next few declarations and nested loops are commented out. I thought I should show this failed attempt.*/

    /*char temp[*rows_p];
    int new_col = (*columns_p + 1) / 2;
    int i = 0;
    int j;
    int k;

    while(fgets(temp, *columns_p, file_in) != NULL){
        int ii = 0;
        for(j = 0; j < *columns_p; j += 2){
            if((temp[i] == '1') || (temp[i] == '0')){
                matrix[i][ii] = temp[j];
                ii++;
            }
        }
        printf("%s", matrix[i]);
        i++;
    }
    printf("\n");
    */

    char temp[*rows_p][*columns_p];
    int i = 0;
    int j;
    int k;

    while(fgets(temp[i], *columns_p, file_in) != NULL){
        for(j = 0; j < *columns_p; j++){
            if((temp[i][j] == '1') || (temp[i][j] == '0')){
                strcpy(matrix[i], temp[i]);
            }
        }
        printf("%s", matrix[i]);
        i++;
    }

    fclose(file_in);
}

这是输入文件中的内容(输入文件是.csv):

0;0;0;0;0;0
0;0;0;1;0;0
0;1;0;1;0;0
0;0;1;1;0;0
0;0;0;0;0;0
0;0;0;0;0;0

这最终将用于生命游戏计划,但我发现自己无法删除分号。我以前做过类似的编辑,但我似乎无法想出这个。非常感谢协助。

我想要实现的输出是,

000000
000100
010100
001100
000000
000000

我期待这是操作矩阵的最简单形式。

1 个答案:

答案 0 :(得分:0)

虽然使用fgets和面向行的方法分离.csv文件中的值没有任何问题,但您可能会发现面向字符的方法更加直观。< / p>

在任何一种情况下,您都不应将测试限制为'0''1'个字符,因为2-9也可以构成任何数字。使用isdigitctype.h的数字的通用测试可以处理所有值。

无论您使用面向行还是面向字符的方法,目标都是相同的,您可以在每个数字的开头找到行中的位置并调用strtol(或{{1或者strtoul(如果适用)将一串数字转换为数值,或者一次缓冲一个字符并在缓冲区上调用转换函数。 (实现转换调用留给你)

在这里,分离值似乎是当前的绊脚石。采用面向角色的方法可能有助于建立对通过一串一个字符一次工作,测试并根据当前角色采取适当行动的理解。从文件阅读的角度来看,它不会更简单,只需打开文件并一次读取一个字符,直到达到文件结尾strtod

一次循环一个字符,你需要保持当前读状态的轨迹(我是读数字还是分隔符?)你的列数基于从数字到分隔符的转换(或{{1 }或EOF)。您的行数基于'\n'EOF)。然后,只需验证每行(对于矩阵)具有相同数量的值,并且当您的读取完成时,您具有与列相同的行数。 (你还应该确保你一起处理任何两个分隔符 - 留给你)

从文件中解析矩阵的面向字符的读取的简短示例可以按照以下方式完成,而不仅限于'\n'EOF

'0'

解析文件的方法有很多种。通过几种方法工作将帮助您识别最适合每种类型的解析问题。

示例输入文件

'1'

示例使用/输出

#include <stdio.h>
#include <ctype.h>

int main (int argc, char **argv) {

    int c,              /* char read from file */
        rows = 0,       /* matrix rows */
        cols = 0,       /* matrix cols */ 
        nvals = 0,      /* values per row count */
        havedigit = 0;  /* flag - reading digits - 1 */
    FILE *fp = argc > 1 ? fopen (argv[1], "r") : stdin;

    if (!fp) {  /* validate file open for reading */
        fprintf (stderr, "error: file open failed '%s'.\n", argv[1]);
        return 1;
    }

    for (;;) {                      /* loop until EOF */
        c = fgetc(fp);              /* get a character */
        if (isdigit(c)) {           /* test if digit */
            havedigit = 1;          /* set havedigit flag */
            putchar (c);            /* output char */
        }   /* end-of-row or end-of-file */
        else if (c == '\n' || c == EOF) {
            if (havedigit) {        /* prev char read was digit */
                nvals++;            /* increment value count */
                putchar ('\n');     /* output newline */
            }
            if (c == EOF)           /* if EOF - bail */
                break;
            if (rows == 0)          /* if first row, set cols */
                cols = nvals;
            else if (nvals != cols) { /* validate no. of cols */
                fflush (stdout);    /* output any bufferd chars */
                fprintf (stderr, "\nerror: not a valid matrix.\n");
                return 1;
            }
            rows++;             /* increment row count */
            nvals = 0;          /* reset value per row count */
            havedigit = 0;      /* set digit flag to zero */
        }
        else {                  /* we have a separator */
            if (havedigit)      /* if last was digit */
                nvals++;        /* increment value per row */
            havedigit = 0;      /* set digit flag to zero */
        }
    }

    if (fp != stdin) fclose (fp);   /* close file if not stdin */

    if (rows != cols) { /* validate rows == cols for sq. matrix */
        fprintf (stderr, "error: not a square matrix.\n");
        return 1;
    }

    return 0;
}

仔细看看,如果您有其他问题,请告诉我。