Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 无法将我的.txt文件打印成行和列,只能打印第一行_C - Fatal编程技术网

C 无法将我的.txt文件打印成行和列,只能打印第一行

C 无法将我的.txt文件打印成行和列,只能打印第一行,c,C,大家好,我是新来的,我想我会征求一些建议。我有我的代码设置来读取Maze.txt文件,并将行和列扫描并打印出来,而不仅仅是读取文本文件。取而代之的是,我只得到了第一行内容,没有任何列。看起来它只是s上面的第一行,但是横穿而过,不会到达新行。我想知道是我犯了一个简单的错误,还是我需要重新分配更多的内存给COL #include <stdio.h> #include <stdlib.h> #define LENGTH 100 typedef struct maze{

大家好,我是新来的,我想我会征求一些建议。我有我的代码设置来读取Maze.txt文件,并将行和列扫描并打印出来,而不仅仅是读取文本文件。取而代之的是,我只得到了第一行内容,没有任何列。看起来它只是s上面的第一行,但是横穿而过,不会到达新行。我想知道是我犯了一个简单的错误,还是我需要重新分配更多的内存给COL

#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,在我看来,你在学习走路之前是在尝试跑步。我建议先试试不那么复杂的东西。