C語言之檔案
阿新 • • 發佈:2019-02-11
1.實驗目的
(1)掌握檔案的基本概念;
(2)學會使用常用的檔案操作函式進行檔案讀寫;
(3)會使用檔案儲存、訪問和管理資料。
2.實驗內容
(1) 課本例題10.2、10.4
(1)用於檔案存取兒童資訊連結串列(原始碼如下)。以下程式是以二進位制檔案實現的,請改寫函式saveList()和getList()以文字檔案格式化讀寫方式(fscanf,fprintf)完成。
// childrenlist.h #include <stdio.h> #include <stdlib.h> typedef struct Child{ float height; float weight; int age; char gender; struct Child *next; } ChildNode; void inputChild( ChildNode* child ); ChildNode* createList( int n ); ChildNode* createSortedList( int n ); void printList( ChildNode *child ); void saveList( FILE *fp, ChildNode* child ); ChildNode* getList( FILE *fp ); // childrenlist.c #include “childrenlist.h“ void inputChild( ChildNode* child ) // 結點資料輸入函式 { printf( “Age: “ ); scanf( “%d“, &child>age); getchar(); printf( “Gender: “ ); scanf( “%c“, &child>gender); printf( “Height: “ ); scanf( “%f“, &child>height); printf( “Weight: “ ); scanf( “%f“, &child>weight); } ChildNode* createSortedList(int n) // 生成有序連結串列 { ChildNode *p, *q, *child; int i; child = (ChildNode*)malloc(sizeof(ChildNode)); // 頭結點 child>next = NULL; // 初始化指標域 for( i = n; i > 0; i ){ // 依次建立並向表頭插入結點 p = (ChildNode *)malloc(sizeof(ChildNode)); // 建立結點 inputChild( p ); // 輸入資料到新結點 q = child; // 查詢新結點的插入位置 while( q>next != NULL && p>age > q>next>age ) q = q>next; p>next = q>next; q>next = p; // 插入新結點 } return child; } void printList( ChildNode *child ) // 遍歷並輸出連結串列 { ChildNode *current; current = child; // 遍歷指標初始狀態指向表頭 while( current>next != NULL ) { current = current>next; // 當前指標移動到下一個結點 // 輸出當前結點資料 printf( “Age %d\t“, current>age ); printf( “Gender %c\t“, current>gender ); printf( “Height %f\t“, current>height ); printf( “Weight %f\n“, current>weight ); } } void saveList( FILE *fp, ChildNode *child ) { ChildNode *current, *pre; // 遍歷指標初始狀態指向表頭之後的資料結點 current = child>next; while( current != NULL ) { pre = current; current = current>next; // 當前指標移動到下一個結點 pre>next = NULL; // 結點指標域置空 // 儲存當前結點資料 fwrite( pre, sizeof(ChildNode), 1, fp ); free( pre ); } } ChildNode* getList( FILE *fp ) { ChildNode *p, *child; child = (ChildNode *)malloc( sizeof(ChildNode) ); child>next = NULL; p = (ChildNode *)malloc( sizeof(ChildNode) ); fread( p, sizeof(ChildNode), 1, fp ); // 讀入資料到新結點 while( !feof(fp) ){ // 依次建立並向表頭插入結點 // 將新結點插入到表頭結點之後 p>next = child>next; child>next = p; p = (ChildNode *)malloc( sizeof(ChildNode) ); fread( p, sizeof(ChildNode), 1, fp ); } return child; } // 主檔案 #include <stdio.h> #include <stdlib.h> #include “childrenlist.h“ int main() { ChildNode *childList = NULL, *childList2 = NULL; int n; float f =1.0; FILE *fp; printf( “Number of children: “); scanf( “%d“, &n ); childList = createSortedList( n ); // 建立有序連結串列 if( (fp = fopen(“childlist.dat“, “wb“)) == NULL ){ fprintf( stderr, “Error opening file.“); exit(1); } saveList( fp, childList ); // 將連結串列存入檔案 fclose( fp ); if( (fp = fopen(“childlist.dat“, “rb“)) == NULL ){ fprintf( stderr, “Error opening file.“); exit(1); } childList2 = getList( fp ); // 從檔案讀出資料生成連結串列 fclose( fp ); printList( childList2 ); // 輸出連結串列 return 0; }
檔案的開啟與使用:
#include<stdio.h> #include<stdlib.h> int main() { FILE*in,*out; char ch,infile[10],outfile[10]; printf("輸入輸出檔名字:"); scanf("%s",infile); printf("輸入輸出檔名字:"); scanf("%s",outfile); if((in=fopen(infile,"r"))==NULL) { printf("無法開啟此檔案\n"); exit(0); } if((in=fopen(outfile,"w"))==NULL) { printf("無法開啟此檔案\n"); exit(0); } while(!feof(in)) { ch=fgetc(in); fputc(ch,out); putchar(ch); } putchar(10); fclose(in); fclose(out); return 0; }
開啟檔案:
#include<stdio.h> #define SIZE 10 struct Student_type { char name[10]; int num; int age; char addr[15]; }stud[SIZE]; void save() { FILE*fp; int i; if((fp=fopen("stu.dat","wb"))==NULL) { printf("cannot oppen file\n"); return; } for(i=0;i<SIZE;i++) if(fwrite(&stud[i],sizeof(struct Student_type),1,fp)!=1) printf("file write error\n"); fclose(fp); } int main() { int i; printf("Please enter data of students:\n"); for(i=0;i<SIZE;i++) scanf("%s%d%d%s",stud[i].name,&stud[i].num,&stud[i].age,&stud[i].addr); save(); return 0; }