【发布时间】:2021-01-22 15:59:11
【问题描述】:
我正在尝试将文本文件中的数字推送到链接列表中,该链接列表可能在多行中有多个数字。我的输出一团糟,只打印了多次 -47。我的主要疑问是如何从文件中读取 2 位数字,尽管我当前的代码甚至没有读取任何数字。
我的代码:
#include <stdio.h>
#include <stdlib.h>
typedef struct linklist
{
int data;
struct linklist *addr;
}ll;
void push(ll **h,int val);
void display(ll **h);
void main()
{
FILE *fp;
fp=fopen("re.txt","r");
char c;
ll *head=NULL;
while(c=fgetc(fp)!=EOF)
{
if(c==' ' || c=='\n')
{
continue;
}
else
{
int temp=c-'0';
printf("Temp = %d",temp);
push(&head,temp);
}
}
printf("check");
display(&head);
fclose(fp);
}
void push(ll **h,int val)
{
if(*h==NULL)
{
ll *temp=(ll*)malloc(sizeof(ll));
temp->data=val;
temp->addr=NULL;
*h=temp;
}
else
{
ll *current = *h;
while(current->addr!=NULL)
current=current->addr;
current->addr=(ll*)malloc(sizeof(ll));
current->addr->data=val;
current->addr->addr=NULL;
}
}
void display(ll **h)
{
ll *current=*h;
while(current->addr!=NULL)
{
printf("%d\t",current->data);
current=current->addr;
}
}
编辑:
re.txt 文件如下所示:
4
2 1 8 19
6 11 50 89
21 22 47
25 35
【问题讨论】:
-
不要使用
fgets,它只读取字符而使用fscanf。还有edit 并显示re.txt的前3-4 行。 -
所以您的列表应该包含数字 4、2、1、8、19、6 等?请确认。
-
旁注:最好避免使用
l或ll这样的名称。我的第一个想法是“那些十一在做什么”。对于 r 值来说更糟。您不必查看代码或将变量误认为数字。 -
请注意,
while(c=fgetc(fp)!=EOF)缺少一组关键的括号。应该是while( (c=fgetc(fp)) != EOF) -
OT:关于:
fp=fopen("re.txt","r");函数调用(如fopen())可能会失败。始终检查 (!=NULL) 返回值以确保操作成功。如果不成功(==NULL),则调用perror( "fopen failed" )将您的错误消息和系统认为错误发生的文本原因输出到stderr,以便通知用户该问题。一般来说,这是一个不可恢复的错误,所以清理然后调用exit( EXIT_FAILURE );
标签: c list while-loop singly-linked-list fgetc