В коде вопроса есть небольшой недостаток.
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