无法将.txt文件打印到行和列中,只有第一行打印

时间:2016-02-29 00:29:59

标签: c

嘿大家我是新来的,以为我会请教一些建议。我有我的代码设置来读取我的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# 
########################################################################

1 个答案:

答案 0 :(得分:0)

我注意到以下错误:

  1. 您在fclose循环中呼叫while。这意味着,在读取第一行后,文件将关闭。因此,您最终只能阅读一行。

  2. 您还可以使用代码在while循环中打印行。恰好,while循环中的代码只执行一次。因此,输出中只有一行。

  3. 您需要将调用移至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
    

    我无法为这些做出任何修正,因为我不知道你希望用它们做些什么。

    免责声明代码中可能还有其他错误。