使用链接列表从文本文件中读取

问题描述 投票:-2回答:1

尝试使用此代码读取文本文件。为什么不显示任何内容?

#include<stdio.h>
#include<stdlib.h>
#define SIZE 100
typedef struct head{
    int total;
    char quest[SIZE],quest1[SIZE],quest2[SIZE],quest3[SIZE];
    struct head *next;
    }LIST;

int main(){
    LIST *ch;
    FILE *fp=fopen("File.txt","r");
    if(fp==NULL){
        printf("File doesn't exist");
        exit(0);
    }
    else{
        fscanf(fp,"%s",&ch->total);
        fscanf(fp,"%s",&ch->quest);
        fscanf(fp,"%s",&ch->quest1);
        fscanf(fp,"%s",&ch->quest2);
        fscanf(fp,"%s",&ch->quest3);
    }
    printf("%s",ch->total);
    printf("%s",ch->quest);
    printf("%s",ch->quest1);
    printf("%s",ch->quest2);
    printf("%s",ch->quest3);
    fclose(fp);
    return 0;
    }

输出:

4
Programming
Stack
Linked List
Pointer Structure

任何帮助将不胜感激,谢谢。 。

c linked-list file-handling
1个回答
0
投票

问题代码中有一个小缺陷。

int main(){
    LIST *ch;

变量c​​h是一个指针,但是它指向的地方是个问题。基本上,它可以指向该进程可用的任何内存位置。设置此指针很重要,以便它指向合适的内存位置。例如,malloc()函数可用于分配合适的内存位置。例如:

int main(){
    LIST *ch = malloc(sizeof(*ch));

这里是问题代码的替代版本,可能会更好地工作:

file.txt:

  4
  Programming
  Stack
  Linked_List
  Pointer_Structure

新代码:

    #include <stdio.h>
    #include <stdlib.h>
    #include <errno.h>

    #define SIZE 100

    typedef struct head{
      int total;
      char quest[SIZE],quest1[SIZE],quest2[SIZE],quest3[SIZE];
      struct head *next;
      }LIST;

    int main()
      {
      int rCode=EXIT_SUCCESS;
      LIST *ch = NULL;

      FILE *fp=fopen("File.txt","r");
      if(!fp)
        {
        rCode=errno;
        fprintf(stderr, "fopen() failed.  errno[%d]\n", rCode);
        goto CLEANUP;
        }

      ch = malloc(sizeof(*ch));
      if(!ch)
        {
        rCode=errno;
        fprintf(stderr, "malloc() failed. errno[%d]\n", rCode);
        goto CLEANUP;
        }

      fscanf(fp,"%d", &ch->total); // %d, not %s, as per Jonathan Leffler
      fscanf(fp,"%s",ch->quest);   // Notice that &ch->quest was changed to ch->quest
      fscanf(fp,"%s",ch->quest1);  //   "      "     "        "     "     "    "
      fscanf(fp,"%s",ch->quest2);  //   "      "     "        "     "     "    "
      fscanf(fp,"%s",ch->quest3);  //   "      "     "        "     "     "    "

      printf("%d\n", ch->total); // %d, not %s, as per Jonathan Leffler
      printf("%s\n",ch->quest);
      printf("%s\n",ch->quest1);
      printf("%s\n",ch->quest2);
      printf("%s\n",ch->quest3);

    CLEANUP:

      if(ch)
        free(ch);

      if(fp)
        fclose(fp);

      return(rCode);
      }

输出:

  4
  Programming
  Stack
  Linked_List
  Pointer_Structure
© www.soinside.com 2019 - 2024. All rights reserved.