2013-09-22 125 views
-2

我一直想在一个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►☺ 

输入文件显示它的好,但问题是阵列输出,我不undrestand为什么告诉我这个caracters

+1

其中是您的代码中的二维数组? –

+0

在一边注意''double atof(const char * str);'是不需要的,因为函数已经在stdlib.h中声明了。您的代码实际上不会使用我的编译器中的该行进行编译。 – jpw

+0

双数[100] [100]; – Butterflay

回答

3

你永远不会改变j时,会始终保持0,所以你写的每一个位置上的[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()。我发布的代码假设它是整数,但确保将数组更改为二维数组(如果它们真的是双精度数据,请在sscanf中更改格式字符串)。

+0

感谢ü乌拉圭回合的答案,我用新的代码编译,但我有一个黑色的康寿它什么都不显示:( – Butterflay

+0

@Butterflay你说得对,对不起, sscanf()最终因为换行符而被阻塞我编辑了我的答案,现在代码正常工作,我测试了它。 –

+0

soryy我有错误getline未定义 – Butterflay

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将分裂基于空间条目和将seperately条目存储在数组中。单维数组也足以存储值。

+0

感谢ü但有许多错误后,编译它 – Butterflay

+0

@Butterflay,你包括头文件?同时运行它作为一个单独的新节目 – user1502952

+0

是的,当然我添加 – Butterflay

相关问题