二维数组的输出未正确输出

时间:2018-12-30 09:41:16

标签: c

我正在尝试读取.txt文件,并将文件中的字符串排列为二维数组并显示输出。

我已经尝试过nested for loop来安排输入并显示输出。

char L[1000];
char ALL[8][1000];

char* filename = "C:\\Users\\user\\Desktop\\NNCENTERS.txt";
FILE *F;

F =fopen(filename, "r");

if(F == NULL){
  printf("Couldnt open file %s", filename);
}

while(fscanf(F, "%s", L) != EOF){
  for(int j=0; j<8;j++){
    for(int i=0;i<1000;i++){
      if(L[i] == 'h' ){
        j++;
      }else{
        ALL[j][i]=L[i];
      }
    }
  }
}

for (int m = 0;  m< 8 ; m++) {
    for (int n = 0; n < 50; n++) {
        printf("%c ", ALL[m][n]);
    }
    printf("\n");
}

该过程终止,没有结果...  我的.txt文件是

Q 2.55555 5.66699 0.22245 0 0 h
P 2.13244 5.66699 0.22245 0 1 h
E 2.82555 5.66699 0.22245 0 2 h
R 2.55125 5.66699 0.22245 1 0 h
T 2.58493 5.66699 0.22245 1 1 h
Y 2.55512 5.66699 0.22245 1 2 h
U 2.52545 5.66699 0.22245 2 0 h
I 2.12455 5.66699 0.22245 2 1 h
O 2.55124 5.66699 0.22245 2 2 h

3 个答案:

答案 0 :(得分:2)

在c中,当您声明任何数组时,它仅包含垃圾值, 我看到您声明了char ALL[8][50];,但从未为其分配任何有意义的值,所以当您执行L[i]=ALL[j][i];时,L[i]中的有意义的值将替换为垃圾值。

因此它将在屏幕上打印垃圾。

我认为您可能想ALL[j][i] = L[i]

编辑:

您将L定义为1000大小的数组,将ALL定义为8x50 但是当您执行for(int i=0;i<1000;i++){然后访问ALL [j] [i]时,它就超出了范围,

您应将ALL设置为ALL[8][1000]

答案 1 :(得分:1)

您的循环必须在读取行的结尾处停止,但是您将继续查看通常在L中读取字符超出的1000个字符

for(int i=0;i<1000;i++){
  if(L[i] == 'h' ){
    j++;
  }else{
    ALL[j][i]=L[i];
  }
}

必须像

for(int i=0;i<1000;i++){
  if (L[i] == 'h') {
    // may be something to do
    j++;
    break;
  }else{
    ALL[j][i]=L[i];
  }
}

for (int m = 0;  m< 8 ; m++) {
  for (int n = 0; n < 50; n++) {
      printf("%c ", ALL[m][n]);
  }
  printf("\n");
}

如果读取的行数少于50个字符,则将打印随机字符

因此,在读取循环中,最好在字符串末尾保存0(在我的评论中为ALL[j][i] = 0;),最后只需这样做

for (int m = 0;  m< 8 ; m++) {
  printf("%s\n", &ALL[m][0]);
}

无论如何,每当您从ALL的开头读取一行时,都会遇到另一个问题,因此只有最后一行会被保存!

还要注意,即使您读得很好,数组也只能记住8行,而文件只有9行,读取行的更简单方法是使用fgets


如果我进行修复和一些简化,结果可能是:

#define NLINES 8 /*needs more probably*/
#define LINELENGTH 1000

char ALL[NLINES][LINELENGTH];

const char* filename = "C:\\Users\\user\\Desktop\\NNCENTERS.txt";
FILE *F = fopen(filename, "r");

if(F == NULL){
  printf("Couldnt open file %s\n", filename);
}
else {
  char (*p)[LINELENGTH] = ALL;

  while (fgets(*p, sizeof(*p), F) != 0) {
    int len = strlen(*p);

    // remove '\n' if present at end of line
    if ((len > 1) && ((*p)[len - 1] == '\n'))
      (*p)[--len] = 0;

    // remove 'h' if present at end of line
    if ((len > 1) && ((*p)[len - 1] == 'h'))
      (*p)[len - 1] = 0;

    if (++p == &ALL[NLINES])
      break;
  }

  fclose(F);

  for (int m = 0;  m< NLINES ; m++) {
    printf("%s\n", ALL[m]);
  }
}

答案 2 :(得分:1)

您使事情变得比原来困难得多。您有一个二维数组,每行包含8行,每行1000个字符。您可以使用fgets直接通过保持行计数器直接读取数组的每一行。然后剩下的就是从每行末尾修剪'\n'(您可以通过使用nul字符0覆盖该字符来完成此操作)

将其完全放在一起,您可以执行以下操作,将文件名作为程序的第一个参数(不要对文件名进行硬编码),或者将程序从stdin中读取(默认情况下) )(如果未提供文件名:

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

#define ROW    8    /* if you need a constant, #define one (or more) */
#define COL 1000

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

    char all[ROW][COL] = { "" };    /* 2D array of char */
    int nrow = 0;                   /* row index */
    /* 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;
    }

    /* read each line protecting array bounds */
    while (nrow < ROW && fgets (all[nrow], COL, fp)) {
        all[nrow][strcspn (all[nrow], "\n")] = 0;       /* trim '\n' */
        nrow++;     /* increment row count */
    }
    if (fp != stdin) fclose (fp);   /* close file if not stdin */

    for (int i = 0; i < nrow; i++)
        printf ("all[%d] : %s\n", i, all[i]);

    return 0;
}

使用/输出示例

$ ./bin/read2dfile <dat/2dfile.txt
all[0] : Q 2.55555 5.66699 0.22245 0 0 h
all[1] : P 2.13244 5.66699 0.22245 0 1 h
all[2] : E 2.82555 5.66699 0.22245 0 2 h
all[3] : R 2.55125 5.66699 0.22245 1 0 h
all[4] : T 2.58493 5.66699 0.22245 1 1 h
all[5] : Y 2.55512 5.66699 0.22245 1 2 h
all[6] : U 2.52545 5.66699 0.22245 2 0 h
all[7] : I 2.12455 5.66699 0.22245 2 1 h

注意:尽管输入文件中有9行,但仅读取8行。通过适当保护数组边界,无论输入行数多少,都可以正确填充数组您的输入文件)

仔细检查一下,如果还有其他问题,请告诉我。