網站首頁 編程語言 正文
本程序主要功能是建立鏈表,然后把鏈表數據存儲到文件中,然后把文件數據存儲到數組中并輸出。
不多說了,放代碼。
此處為main函數的內容
int main(void)
{
char filename[50];
printf("How many ?: ");
scanf("%d", &n); /*輸入學生數*/
printf("please input filename: ");
scanf("%s", filename); /*輸入文件所在路徑及名稱*/
Create(); //調用函數建立鏈表
save(filename); //調用函數存到文件
free(phead);//釋放phead內存
show(filename); //調用函數輸出文件
system("pause");
return 0;
}
一、輸入數據到鏈表中
建立鏈表并輸入數據到鏈表里
代碼如下:
typedef struct stu
{
char name[20];
char adr[20];
int tel;
struct stu* pnext;
} stu;
int n; //n存著信息條數
stu* phead=NULL;//phead為鏈表首地址
void Create() //建立鏈表
{
stu *pend,*pnew;//尾節點,新節點
pend=phead =(stu*)malloc(sizeof(stu));//分配內存給首節點
printf("please first input Name, Adress and telephone:\n");
for(int i=0;i<n;i++)
{
pnew=(stu*)malloc(sizeof(stu)); //分配新節點
pend->pnext=pnew; //原來的尾節點指向新節點
pnew->pnext=NULL; //新節點的指針為NULL
printf("NO.%d: ",i+1);
scanf("%s", pend->name);
scanf("%s", pend->adr);
scanf("%d",&pend->tel);
pend=pnew; //賦值后指向尾節點
}
pnew=pnew->pnext;//指向NULL
free(pnew); //釋放pnew內存
}
二、把鏈表數據存入文件
此處用到了fopen、fprintf、fclose等文件操作函數
代碼如下:
void save(char *filename)
{
FILE *w;//文件指針
if ((w = fopen(filename, "wb")) == NULL){ /*二進制只寫打開文件*/
printf("cannot open file\n");
exit(1);
}
for (int i = 0; i < n; i++) //鏈表數據循環輸入到文件內
{
fprintf(w,"%s ",phead->name);
fprintf(w,"%s ",phead->adr);
fprintf(w,"%d", phead->tel);
fprintf(w,"%s","\r\n");//換行
phead=phead->pnext;//指向下一個節點
}
fclose(w); //關閉文件
}
三、輸出文件
先把文件內容保存到結構體數組內,然后再通過數組輸出到屏幕上。
代碼如下:
void show(char *filename) //輸出文件
{
FILE *fp;//文件指針
stu info[100]; //負責存放文件中的數據,然后輸出
if ((fp = fopen(filename, "rb")) == NULL){ /*二進制只讀打開文件*/
printf("cannot open file\n");
exit(1);
}
for (int i = 0; i < n; i++)
{
fscanf(fp,"%s",&(info[i].name));//輸出數據到數組
fscanf(fp,"%s",&(info[i].adr));
fscanf(fp,"%d",&(info[i].tel));
printf("%10s%15s%15d\n", info[i].name,
info[i].adr, info[i].tel); //輸出數據到屏幕
}
fclose(fp); //關閉文件
}
完整代碼
/*此代碼為《C語言從入門到精通(第二版)》第十四章(文件)的【例14.7】的改進版*/
#include<stdio.h>
#include<stdlib.h>
#include<process.h>
typedef struct stu
{
char name[20];
char adr[20];
int tel;
struct stu* pnext;
} stu;
int n; //n存著信息條數
stu* phead=NULL;//phead為鏈表首地址
void Create()/*建立鏈表*/
{
stu *pend,*pnew;//尾節點,新節點
pend=phead =(stu*)malloc(sizeof(stu));//分配內存給首節點
printf("please first input Name, Adress and telephone:\n");
for (int i = 0; i < n; i++)
{
pnew=(stu*)malloc(sizeof(stu)); //分配新節點
pend->pnext=pnew; //原來的尾節點指向新節點
pnew->pnext=NULL; //新節點的指針為NULL
printf("NO.%d: ",i+1);
scanf("%s", pend->name);//輸入數據存到鏈表中
scanf("%s", pend->adr);
scanf("%d",&pend->tel);
pend=pnew; //賦值后指向尾節點
}
pnew=pnew->pnext;//指向NULL
free(pnew); //釋放pnew內存
}
void save(char *filename)/*存到文件內*/
{
FILE *w;//文件指針
if ((w = fopen(filename, "wb")) == NULL){ /*二進制只寫打開文件*/
printf("cannot open file\n");
exit(1);
}
for (int i = 0; i < n; i++) //鏈表數據循環輸入到文件里
{
fprintf(w,"%s ",phead->name);//數據存入到文件
fprintf(w,"%s ",phead->adr);
fprintf(w,"%d", phead->tel);
fprintf(w,"%s","\r\n");//換行
phead=phead->pnext;//指向下一個節點
}
fclose(w); //關閉文件
}
void show(char *filename)/*輸出文件*/
{
FILE *fp;//文件指針
stu info[100]; //負責存放文件中的數據,然后輸出
if ((fp = fopen(filename, "rb")) == NULL){ /*二進制只讀打開文件*/
printf("cannot open file\n");
exit(1);
}
for (int i = 0; i < n; i++)
{
fscanf(fp,"%s",&(info[i].name));//輸出數據到數組
fscanf(fp,"%s",&(info[i].adr));
fscanf(fp,"%d",&(info[i].tel));
printf("%10s%15s%15d\n", info[i].name,
info[i].adr, info[i].tel);//輸出數據到屏幕
}
fclose(fp);/*關閉文件*/
}
int main(void)
{
char filename[50];
printf("How many ?:\n");
scanf("%d", &n); /*輸入學生數*/
printf("please input filename: ");
scanf("%s", filename); /*輸入文件所在路徑及名稱*/
Create(); //調用函數建立鏈表
save(filename); //調用函數存到文件
free(phead);//釋放phead內存
show(filename); //調用函數輸出文件
system("pause");
return 0;
}
我嘗試過fread和fwrite的做法,但都失敗了。
原文鏈接:https://www.cnblogs.com/CVE-Lemon/p/16188014.html
相關推薦
- 2022-06-01 jQuery實現選項卡嵌套效果_jquery
- 2022-06-19 詳解.Net中字符串不變性與相等判斷的特殊場景_實用技巧
- 2022-03-27 NGINX?權限控制文件預覽和下載的實現原理_nginx
- 2022-09-14 C#通過不安全代碼看內存加載的示例詳解_C#教程
- 2022-07-03 go實現分布式鎖
- 2022-12-22 Python使用imagehash庫生成ahash算法的示例代碼_python
- 2022-09-03 ahooks解決用戶多次提交方法示例_React
- 2022-02-18 取一個數組中想要的值,放到一個新的對象里
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支