Чтение из текстового файла с использованием списка ссылок - PullRequest
0 голосов
/ 28 октября 2019

Попытка прочитать текстовый файл, используя эти коды. Почему ничего не отображается?

#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

любая помощь будет принята с благодарностью, спасибо. .

1 Ответ

0 голосов
/ 28 октября 2019

В коде вопроса есть небольшой недостаток.

int main(){
    LIST *ch;

Переменная ch является указателем, но проблема в том, куда она указывает. По сути, это может быть указание на любую область памяти, доступную для процесса. Важно установить этот указатель, чтобы он указывал на подходящее место в памяти. Например, функция 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
...