嘿大家我是新来的,以为我会请教一些建议。我有我的代码设置来读取我的Maze.txt文件并扫描并打印出行和列而不是只读取文本文件。相反,我只是第一行读入而没有列。看起来它只是s上方的第一行,但是它们全部并且它不会转到换行符。我想知道我是否犯了一个简单的错误,还是需要为Cols重新分配更多内存?
#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;
}
}
}
我的Maze.txt文件也是如此。
########################################################################
#s # # # #
# # # ############ #################### #################### ##### ##
# # # ## # # ######## # #
# # # # #################### #################### ## ####### #
# # # ## # ########### # # #
# # # # # ######################################### ##### #
# ## # ######### # ######
# # # # # #################### ################ ### # #
# # # ## # ############# # # ## ################
# # # # # ###################### # #
# # # ## # ################### # # # # ###### ########### #
# # # # ############# # # # # # # #
# # # # # #################### ######### # # ## ## #
# # ## # ############# # # # ## ## #
# # # ## # ############# ####### # # # #
# # # ## # #################### # # # ## ## #
# ### ## # #################### ####### # # # ## ## #
# # # # # g#
########################################################################
答案 0 :(得分:0)
我注意到以下错误:
您在fclose
循环中呼叫while
。这意味着,在读取第一行后,文件将关闭。因此,您最终只能阅读一行。
您还可以使用代码在while
循环中打印行。恰好,while
循环中的代码只执行一次。因此,输出中只有一行。
您需要将调用移至fclose
并使用代码打印while
循环之外的行。
还有一些..
我不明白你打算用这条线做什么:
Rows[strlen (Rows)+1] = '\0';
正如代码现在所说,这将导致未定义的行为,因为Rows
,其结果是指向数组的第一个元素的指针是未初始化的。
该行
if (sscanf (line, "%s %s", Rows, Cols) != 1)
没有经过深思熟虑。如果您希望在line
中找到一个项目,请使用:
if (sscanf (line, "%s %s", Rows) != 1)
如果您希望在line
中找到恰好两个项目,请使用:
if (sscanf (line, "%s %s", Rows, Cols) != 2) // 2, not 1
我无法为这些做出任何修正,因为我不知道你希望用它们做些什么。
免责声明代码中可能还有其他错误。