『壹』 鏈表寫入文件與讀出 c語言
structstu
{longnum;
charname[10];
intscore;
structstu源轎*next;
};
#defineSIZE(&(((structstu*)NULL)->next))
intsave(structstu*l,char*file)
{
FILE*fp;
fp=fopen(file,"wb");
if(fp==NULL)return0;
while(l)
{
fwrite(l,SIZE,1,fp);
}
fclose(fp);
return0;
}
structstu*load(char*file)
{
FILE*fp;
structstu*h=NULL,*p,*t;
fp=fopen(file,"wb");
if(fp==NULL)returnNULL;
while(l)
{
t=(structstu*)malloc(sizeof(structstu));
fread(t,SIZE,1,fp);
t->next=NULL;
if(feof(fp))
{
free(t);
break;
}
if(h==NULL)h=p=t;
else
{
雹鉛肆p->next=t;
激坦p=t;
}
}
fclose(fp);
returnh;
}
以上是不帶頭結點鏈表的讀寫。
帶頭結點的, 只需要稍做改動即可。
『貳』 鏈表文件讀取與寫入的C語言程序代碼怎麼寫啊
一雹陵模邊讀取鏈表裡面的內容,一邊使用write函數寫進文件;
一邊用源緩read函數讀取文件信息,一邊保存在鏈表中。
鏈表保存信息,必須要結構體,因為要有地址保存下個鏈表的地址
struct test
{
char arry[100];//用於保存信息
struct test * next;//用於保存下個內容信息的指針地址
};
這樣就可以把信息鏈接在一起了汪沖。
『叄』 C語言鏈表的讀取
把你的主函數和操作步驟貼出來唄
『肆』 C語言 如何將文件里數據讀入鏈表中,在下次用時自動導入數據
給你優化了一下,你試試,有問題再聯系
#include<stdio.h>
#include<stdlib.h>
#define LEN sizeof(struct Stu)
struct Stu *inlist();
void save(struct Stu *head);
struct Stu *add(struct Stu *head);
void insertNode(struct Stu *head,struct Stu *newNode);
struct Stu *read();
void print(struct Stu *head);
typedef struct Stu{
char name[20];
char sex[10];
char dep[20];
int number;
struct Stu *next;
}sqlist;
sqlist *inlist()/*數據的輸入*/
{
sqlist *p,*q;
sqlist *head;
int n=0;
printf("請輸入名字 性別 部門 學號:\n");
p=q=(sqlist*)malloc(LEN);
scanf("%s%s%s%d",p->name,p->sex,p->dep,&p->number);
head=NULL;
while(p->number!=0)
{n=n+1;
if(n==1)
head=p;
else
q->next=p;
q=p;
p=(sqlist*)malloc(LEN);
scanf("%s%s%s%d",p->name,p->sex,p->dep,&p->number);
}
q->next=NULL;
return head;
}
void save(sqlist *head)
{
sqlist *p;
FILE *f;
p=head;
if(p!=NULL)
{
f=fopen("amd.txt","w+");
do
{
/*
char name[20];
char sex[10];
char dep[20];
int number;
fprintf(f,"%5s%5s%5s%5d\n",&p->name,&p->sex,&p->dep,&p->number);
printf("%5s%5s%5s%5d\n",p->name,p->sex,p->dep,p->number);
數據如果超過5的長度,讀的時候就不能正確取出來了,因此,應該按數據定義的長度來記錄數據
+1是為了讀取時方便,左對齊右補空格
**/
fprintf(f,"%-21.21s%-11.11s%-21.21s%-11d\n",p->name,p->sex,p->dep,p->number);
p=p->next;
}
while(p!=NULL);
fclose(f); //fclose要和fopen相呼應
}
//close(f);
}
sqlist *add(sqlist *head)
{
sqlist *p,*New;
//sqlist *q;
p=head;
while(p->next!=NULL)
{
p=p->next;
}
printf("請輸入名字 性別 部門 學號:\n");
New=(sqlist*)malloc(LEN);
scanf("%s%s%s%d",New->name,New->sex,New->dep,&New->number);
New->next=p->next;
p->next=New;
if(New->next==NULL)
{
return head;
}
else
printf("wait");
return head;
}
sqlist *read()
{
FILE *fp;
sqlist *f,*head=NULL; //指針要習慣給它賦初值NULL,不要形成野指針
char str[128];
if((fp=fopen("amd.txt","r+"))==NULL)
{
printf("打開文件失敗!!\n");
return head; //此時head is NULL
}
if( fgets( str , sizeof(str) , fp ) == NULL )
{
printf("文件中沒有數據!\n");
fclose(fp);
return head; //此時head is NULL
}
//有數據再創建鏈表,不要創建空表
head=(sqlist*)malloc(LEN);
if(head==NULL)
{
printf("分配內存失敗!\n");
fclose(fp);
exit(0);
}
head->next=NULL;
sscanf(str,"%s %s %s %d",head->name,head->sex,head->dep,&head->number) ;
while (fgets( str , sizeof(str) , fp ) != NULL)
{
f=(sqlist*)malloc(LEN);
f->next=NULL;
sscanf(str,"%s %s %s %d",f->name,f->sex,f->dep,&f->number) ;
insertNode(head,f);
}
fclose(fp);
return head;
}
void insertNode(sqlist *head,sqlist *newNode)
{
sqlist *f;
f=head;
while(f->next!=NULL)
{
f=f->next;
}
f->next=newNode;
newNode->next=NULL;
}
void print(sqlist *head)
{
sqlist *f;
f=head;
if(f!=NULL)
{
do
{
printf("%-21s%-11s%-21s%-11d\n",f->name,f->sex,f->dep,f->number);
f=f->next;
}while(f!=NULL);
}
}
int main()
{
sqlist *head;
head=read();
if ( head == NULL )
{
head=inlist();
save(head);
}
else
print(head);
head=add(head);
save(head);
print(head);
return 0;
}
『伍』 C語言中鏈表的存儲、讀取、修改問題
1、鏈表存到文件中去後,再取出來是不是要再次對各個元素進行鏈表的關聯(就是下一個元素地址賦予前一個元素中的地址變數中)?有沒有更簡單的方法讓其自動恢復原先的鏈表關系?
答:鏈表的關系的卻需要重新建立,沒有別的方法,這里只需要重新設置,因為鏈表是存儲在內存中的,每次malloc出來的指針地址不一致,無法存儲到文件中,下次繼續使用。
2、編輯前,是否需要將整個文件流從文件中都讀取至堆里去,連立成一個鏈表?如果文件很大,大過內存怎麼辦?
答:文件中存儲的是整個鏈表的信息,你只需要每次讀出一個struct就可以了。這個malloc出來的struct中你需要讀取一個index的值,然後以這個index的值再建立一個鏈表,將原來那個malloc出來的struct可以釋放,這樣就可以不用擔心文件很大,怕內存不足的情況。因為即使你的鏈表再長,一個int值足以表示。如果怕int(4位元組)不夠,可以用double類型,甚至可以用鏈表嵌套。
3、如果整個文件都讀出至堆中,並關聯成了鏈表,那麼修改後用fwrite()再次保存至文件中時,是不是把原來的記錄都覆蓋了還是在後面追求啊?
答:這里寫文件就看你自己是怎麼打開文件了。(存儲的時候是不是按照struct大小存儲還是按照實際數據大小存儲)最好的方式是可以隨便修改,這種方式最難,因為要考慮到更改的是第幾個位元組。最簡單的方式,直接將文件刪除,重新建立,但是這樣就必須要將所有數據讀取到內存中。
如果你要實現問題2中的方法,則問題3即要做大量的修改。
『陸』 C語言單向鏈表中如何往文件里存入數據和讀取數據
只需要將文件標示為二進制即可。
struct student stu[256];
//將stu賦值...
FILE * fd=fopen("c:\\test.bin","wb");//打開
int i;
for(i=0;i<256;i++)//寫入
fwrite((void*)&stu[i],sizeof(struct student),1,fd);
//讀取第k個結構體
struct student rstu;
FILE *fd=fopen("c:\\test.bin","rb");//打開
fseek(fd,k*sizeof(struct student),SEEK_SET);//定位
fread(&rstu,sizeof(struct student),1,fd);//讀取