C 无法将我的.txt文件打印成行和列,只能打印第一行
大家好,我是新来的,我想我会征求一些建议。我有我的代码设置来读取Maze.txt文件,并将行和列扫描并打印出来,而不仅仅是读取文本文件。取而代之的是,我只得到了第一行内容,没有任何列。看起来它只是s上面的第一行,但是横穿而过,不会到达新行。我想知道是我犯了一个简单的错误,还是我需要重新分配更多的内存给COLC 无法将我的.txt文件打印成行和列,只能打印第一行,c,C,大家好,我是新来的,我想我会征求一些建议。我有我的代码设置来读取Maze.txt文件,并将行和列扫描并打印出来,而不仅仅是读取文本文件。取而代之的是,我只得到了第一行内容,没有任何列。看起来它只是s上面的第一行,但是横穿而过,不会到达新行。我想知道是我犯了一个简单的错误,还是我需要重新分配更多的内存给COL #include <stdio.h> #include <stdlib.h> #define LENGTH 100 typedef struct maze{
#include <stdio.h>
#include <stdlib.h>
#define LENGTH 100
typedef struct maze{
struct maze *next;
char *Rows;
char *Cols;
short Starts;
short Goals;
} MAZE;
MAZE *first = NULL;
MAZE *last = NULL;
int main(int argc,char *argv[])
{
FILE *fp;
char line[LENGTH],Rows[LENGTH], Cols[LENGTH];
MAZE *PM;
fp = fopen(argv[1], "r");// read mode
if( fp == NULL )
{
perror("Error while opening the file.\n");
return -1;
}
while (fgets (line, sizeof(line), fp) != NULL) {
// Check for errors
if (line[0] == '\0') {
printf ("Line too short\n");
return -1;
}
if (line[strlen (line)-1] != '\n') {
printf ("Line starting with '%s' is too long\n", Rows);
return -1;
}
Rows[strlen (Rows)+1] = '\0';
if (sscanf (line, "%s %s", Rows, Cols) != 1)
{
printf ("Line '%s' didn't scan properly\n", line);
return -1;
}
PM = malloc (sizeof (MAZE));
if (PM == NULL) {
printf ("Ran out of memory\n");
return -1;
}
PM->Rows = strdup (Rows);
PM->Cols = strdup (Cols);
PM->next = NULL;
if (first != NULL) {
last->next = PM;
last = PM;
} else {
first = PM;
last = PM;
}
fclose(fp);
PM = first;
while(PM != NULL) {
printf("%s\n%s",PM->Rows,PM->Cols);
PM = PM->next;
return 0;
}
}
}
我注意到以下错误:
while
循环中调用fclose
。这意味着,在读取第一行之后,文件将关闭。因此,你只能读一行while
循环中打印行。因此,while
循环中的代码只执行一次。因此,输出中只有一行fclose
,并将代码移动到while
循环外打印行
还有一些
我不明白你打算怎么处理这条线路:
Rows[strlen (Rows)+1] = '\0';
现在的代码表明,这将导致未定义的行为,因为行
,其计算结果是指向数组第一个元素的指针未初始化
线路
if (sscanf (line, "%s %s", Rows, Cols) != 1)
没有经过深思熟虑。如果您希望在行
中只找到一项,请使用:
if (sscanf (line, "%s %s", Rows) != 1)
if (sscanf (line, "%s %s", Rows, Cols) != 2) // 2, not 1
如果您希望在行
中正好找到两个项目,请使用:
if (sscanf (line, "%s %s", Rows) != 1)
if (sscanf (line, "%s %s", Rows, Cols) != 2) // 2, not 1
我无法建议对这些问题进行任何修复,因为我不知道您希望用它们实现什么
免责声明代码中可能还有其他错误。这很有道理,在我这么做之后,它告诉我以“#”开头的行太长了。所以我猜我需要改变分配,以完全匹配我的第一行。应该是72个字符长。整个迷宫的内存分配是问题所在吗?我是否需要为单独的行和列分配内存?@R Sahu,我正在尝试将该文本文件(行和列)中的所有内容准确地打印出来,并将其显示在文本文件中。但是,在不调用printf语句的情况下执行此操作,而是逐行显示。@Mags,在我看来,您不清楚如何表示迷宫的数据。我认为您只需要一个
Maze
类型的对象,但是您已经将Maze
定义为一个链表。我不清楚您打算如何捕获数据。@R Sahu,我对C真的很陌生。我从一些没有很好教授的Java课程中学习了一本C编程书。你是对的,事实上我对一些事情不清楚。我想做的是把我的文本文件读入structs内存,然后调用该内存并打印出迷宫的线条。@Mags,在我看来,你在学习走路之前是在尝试跑步。我建议先试试不那么复杂的东西。