1. 程式人生 > >C語言之檔案

C語言之檔案

1.實驗目的

1)掌握檔案的基本概念;

2)學會使用常用的檔案操作函式進行檔案讀寫;

3)會使用檔案儲存、訪問和管理資料。

2.實驗內容

(1) 課本例題10.210.4

1)用於檔案存取兒童資訊連結串列(原始碼如下)。以下程式是以二進位制檔案實現的,請改寫函式saveList()和getList()以文字檔案格式化讀寫方式(fscanffprintf)完成。

// 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;
}