尝试使用此代码读取文本文件。为什么不显示任何内容?
#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
任何帮助将不胜感激,谢谢。 。
问题代码中有一个小缺陷。
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