从文本文件中读取并存储在2D数组中

时间:2013-09-22 10:16:43

标签: c

我一直在尝试将矩阵输入存储在数组中的txt文件中,但它向我显示: 这是代码

   #include <stdio.h>

int main()
{
    int c, i, j, row, col, nl, cr;

    row = col = nl = cr = 0;

    FILE *fp = fopen("g.txt", "r");

    // Figure out how many rows and columns the text file has
    while ((c = getc(fp)) != EOF)
    {
        if (c == '\n')
            nl++;
        if (c == '\r')
            cr++;

        col++;

        if (c == '\n')
            row++;

       putchar(c);
    }

    col = (col - (nl + cr));
    col = (int) (col/row);

   // printf("\nnumber of rows is %d\n", row);


    // read letters into array

    char array[row][col];

    if ( fp )
       {
        for ( ;; )
              {
            c = getc(fp);
                 if ( c == EOF )
                 {
                        break;
                 }
                 if ( c != '\n' && c != '\r' )
                 {
                        array[i][j] = c;

                    if ( ++j >= col )
                        {
                            j = 0;
                            if ( ++i >= row )
                            {
                                break;
                            }
                        }
                }
            }
        fclose(fp);
    }

    for ( i = 0; i < row; i++ )
    {
            for ( j = 0; j < col; j++ )
            {
                 putchar( array[i][j]);
            }
            putchar('\n');
    }
    return 0;
}
请问有人有什么想法吗? 例如txt文件:

255  50  9  50  1  50  50  1
50  255  50  50  50  50  50 50
50  50  255  50  50  50 50  50
8  50  50  255  50 50  50  50
50  50  50  50 255 50  50  50
50  50  50 50  50  255  50  50
1  50 50  50  50  50  255  50
2 50  50  50  50  50  50  255 

我的节目告诉我这个:

255 50   9   50  1   50   50   1
50  255  50  50  50  50   50   50
50  50   255 50  50  50   50   50
8   50   50  255 50  50   50   50
50  50   50  50  255 50   50   50
50  50   50  50  50  255  50   50
1   50   50  50  50  50   255  50
2   50   50  50  50  50   50   255     $■( 1gÍuáþ09■   ı¤ıu"ÒávD   ê$[
►  ð²(     ♥       l    ►      ■   
  ê$[ ♥   l       ­²( O»ƒv[ 4■( Qõá
v♥   #õáv┬²║Oÿ|®v    ñ|®ve┬ív
 ■(     x■( ÿ|®v Ó²⌂    @■(  áƒv╚♀[ L
■( w¯ƒv‼   ê■( I┴ávÿ|®v↓┴áv~²║O
   Ó²⌂    \■( ■   ─ ( e┬ívÍ┬29►☺

对于输入文件,它显示的是好的,但问题是数组输出我不会动摇,为什么它会告诉我这个caracters

2 个答案:

答案 0 :(得分:3)

你永远不会改变j,它总是保持为0,所以你正在写每个位置a [i] [0]。的atoi(线);将仅转换行中的第一个数字。这就是你的程序只存储第一列的原因。

解决此问题的可能方法如下:

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

int main(void) {
    int  i=0,totalNums,totalNum,j=0;
    size_t count;
    int numbers[100][100];
    char *line = malloc(100);

    FILE *file;  /* declare a FILE pointer  */
    file = fopen("g.txt", "r");  /* open a text file for reading */

    while(getline(&line, &count, file)!=-1) {
        for (; count > 0; count--, j++)
            sscanf(line, "%d", &numbers[i][j]);
        i++;
    }

    totalNums = i;
    totalNum = j;
    for (i=0 ; i<totalNums ; i++) {
      for (j=0 ; j<totalNum ; j++) {
        printf("\n%d",  numbers[i][j]);
      }
    }
    fclose(file);
    return 0;
}

该代码将读取整行,然后逐个数字地解析,直到没有更多的数字为止。

我真的不明白输入应该是整数还是双精度,请注意你声明了一个二维的二维数组但是你调用了atoi()。我发布的代码假定它是整数,但是请确保将数组更改为2D数组(或者如果它们确实是双精度数,则更改sscanf中的格式字符串)。

答案 1 :(得分:1)

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

using namespace std;

int main(void)
{
  FILE * fp;
  char * line = NULL;
  size_t len = 0;
  ssize_t read;

  const char *s = " ";
  char *token = NULL;

  int i = 0;
  double arr[200];
  int j;

  fp = fopen("g.txt", "r");
  if (fp == NULL)
  {
    printf("Error opening");
    exit(EXIT_FAILURE);
  }

  while ((read=getline(&line, &len, fp)) != -1)
  {
     token = strtok(line, s);

     while(token != NULL)
     {
       arr[i] = atoi(token);
       printf("%f\n", arr[i]);
       token=strtok(NULL,s);
       i++;
     }
  }

  exit(EXIT_SUCCESS);
  return 0;
}

getline将逐行读取文件,strtok将根据空格拆分条目,并将单独存储在数组中。单维数组也足以存储值。