我正在尝试读取.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
答案 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行。通过适当保护数组边界,无论输入行数多少,都可以正确填充数组您的输入文件)
仔细检查一下,如果还有其他问题,请告诉我。