文件读取和存储为C中的int

时间:2014-10-25 00:49:29

标签: c

以下是该方案。我在文件中有一个矩阵,其中包含数字和字母x。 x表示没有路径发生。我试图读取一个文件并将其存储在一个int数组中。但它不能很好地运作。 x的值不会改为99999。

graph.txt
0 x x x x x
x 0 x x x x
x x 0 x x x
x x x 0 x x
x x x x 0 x
x x x x x 0

this is the result. 

 0    2291852    1988293161    5507688    2291916    1988315945
 3    1988315897    1238539516    3    1988897120    0
 3    0    1988897120    2291908    1988273218    5508800
 2291920    1988293445    19    2291976    1988390633    1988897120
 1988390584    1238539576    2293452    0    2293256    2291936
 1988339419    2293700    1988398293    1064569584    160    0

这是代码

 # define x 99999
 int main(){

char filename[200]="";

char buffer[200];

int ch;

FILE * fileIn;

FILE * fileInn;

    printf("\tEnter Filename> ");

    scanf("%s", &filename); //Enter filename


        if((fileIn = fopen(filename, "r")) == NULL) { //error filename

            printf("File could not be opened. \n");}

        else {


            while(!feof(fileIn)){ //counts number of rows 

                    ch = fgetc(fileIn);

                    if(ch == '\n') size+=1;

            }



            rewind(fileIn);



            if(!(feof(fileIn))){ //puts the matrix in an array

                int input[size][size];

                for(a = 0; a<size; a++) {

                    for(b=0; b<size; b++) {

                        fscanf(fileIn, "%d", &input[a][b]);     

                    }

                }

                printMatrix(input);



            }else printf("EOF");
    }

}

当矩阵元素为x时,我想要发生的是。 x将被读取为99999并将其存储在输入数组中。如果它是一个整数,它将直接存储在输入数组中。

2 个答案:

答案 0 :(得分:3)

有许多方法可以从文件中读取数组。您的挑战增加了一个简单的复杂功能,您必须从文件中读取字符和整数,然后根据字符是否代表数字或是否是单个字符来将元素添加到数组中。 X&#39;然后你将其替换为值&#39; 99999&#39;。

最简单的方法是使用面向行的输入从数据文件中一次读取一行,然后根据需要解析每一行。我建议您与getline交朋友,以满足您的所有线路输入需求。与fgetsscanf相比,它提供了许多好处,并且不会比其他任何一项更省力。

从输入中读取数据行后,需要将行拆分为单词。 strtok是首选工具,否则您可以编写自定义解析器(根据您的需要)。 strtok在这里运作正常。将行拆分为单词时,可以测试每个单词以确定它们是代表数字还是字符。有很多方法可以做到这一点。在您的情况下,一种简单/有效的方法就是测试第一个字符是否为'x'。如果是,请用99999替换数组值,如果没有,只需使用atoi (word)将单词转换为整数。

以下是完成上述所有操作的一个方法。如果您有任何问题,请仔细阅读并告诉我。

oops最初有&#39; 9999&#39;而不是&#39; 99999&#39; - 已修复

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_SIZE 1024

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

    if (argc < 2) {
        fprintf (stderr, "Error: insufficient input. Usage: %s input_file\n", argv[0]);
        return 1;
    }

    char *line = NULL;      /* forces getline to allocate space for buf */
    ssize_t read = 0;       /* number of characters read by getline     */
    size_t n = 0;           /* limit number of chars to 'n', 0 no limit */
    int idx = 0;            /* simple index counter for array           */
    int row = 0;            /* simple row counter index for array       */
    int *col = NULL;        /* simple column counter for array          */
    int *array = NULL;      /* array to hold integers read from file    */
    char *delim = " \n";    /* delimeter for strtok to parse line       */

    FILE *ifp = fopen(argv[1],"r");
    if (!ifp)
    {
        fprintf(stderr, "\nerror: failed to open file: '%s'\n\n", argv[1]);
        return 1;
    }

    array = calloc (MAX_SIZE, sizeof (array));      /* allocate MAX_SIZE elements           */
    col   = calloc (MAX_SIZE, sizeof (col));        /* allocate MAX_SIZE elements           */

    while ((read = getline (&line, &n, ifp)) != -1) /* read each line in file with getline  */
    {
        char *tmp = NULL;                           /* pointer to hold strtok results       */

        tmp = strtok (line, delim);                 /* first call to strtok using 'line'    */

        if (*tmp == 'x')                            /* test if tmp[0] = 'x'                 */
            array [idx++] = 99999;                  /* if so, assign value of '99999'       */
        else
            array [idx++] = atoi (tmp);             /* if not, assign result of atoi (tmp)  */

        col[row]++;                                 /* increase column count                */

        while ((tmp = strtok (NULL, delim)) != NULL) /* all remaining strtok calls use NULL */
        {
            if (*tmp == 'x')                        /* same tests as above                  */
                array [idx++] = 99999;
            else
                array [idx++] = atoi (tmp);

            col[row]++;                             /* increase column count                */

        }
        row++;                                      /* increase row count                   */
    }

    if (line) free (line);                          /* free memory allocated by getline     */

    int it = 0;                                     /* simple index iterator                */

    while (col[it])                                 /* simple loop to validate columns      */
    {
        if (it > 0)
            if (col[it-1] != col[it])
            {
                fprintf (stderr, "Error: inconsistent colums of data read\n");
                return 0;
            }
        it++;
    }

    printf ("\nProperties of array read from file '%s':\n\n", argv[1]);
    printf ("  elements: %d\n  rows    : %d\n  cols    : %d\n", idx, row, col[0]);

    printf ("\nArray elements:\n\n");

    for (it = 0; it < idx; it++)                    /* output information stored in array   */
    {
        if ((it+1) % col[0] == 0 && it > 0)
            printf (" %5d\n", array[it]);
        else
            printf (" %5d", array[it]);
    }
    printf ("\n");

    if (array) free (array);                        /* free memory allocated to arrays      */
    if (col)   free (col);

    return 0;
}

输入文件:

$ cat dat/graph.txt
0 x x x x x
x 0 x x x x
x x 0 x x x
x x x 0 x x
x x x x 0 x
x x x x x 0

<强>输出:

$ /bin/rgraph dat/graph.txt

Properties of array read from file 'dat/graph.txt':

  elements: 36
  rows    : 6
  cols    : 6

Array elements:

     0 99999 99999 99999 99999 99999
 99999     0 99999 99999 99999 99999
 99999 99999     0 99999 99999 99999
 99999 99999 99999     0 99999 99999
 99999 99999 99999 99999     0 99999
 99999 99999 99999 99999 99999     0

答案 1 :(得分:0)

#define x 99999告诉编译器将符号x视为程序中的值99999 ;它对如何处理从文件中读取的字符没有影响。

由于您明确告诉fscanf您希望读取一个整数,因此没有理由期望它合理(因为您只是骗了它)。

可以做的事情在每个符号中作为字符串读取,如果是x,则执行适合您的程序的任何操作;您可以使用atoi sscanf之类的实用程序来处理那些实际上是整数的实用程序。