?? ex13.cpp
字號:
// 第13章 文 件
// [例13.1] 格式轉換處理一個結構變量
#include<stdio.h>
typedef struct SData
{ int nLineset; float fAdjust;int nPoint;
float fXa; float fYa; float fZa;
} CData;
void OutputData(const char *filename,const CData &d )
{
FILE *fp= fopen(filename, "w");
fprintf(fp,"%d,%f,%d\n",d.nLineset,d.fAdjust,d.nPoint);//1
fprintf(fp,"%f,%f,%f\n", d.fXa,d.fYa,d.fZa);//2
fclose(fp);
}
void InputData(const char *filename,CData &d )
{ FILE *fp = fopen(filename, "r");
fscanf(fp,"%d,%f,%d",&d.nLineset,&d.fAdjust,&d.nPoint);//1
fscanf(fp,"%f,%f,%f", &d.fXa, &d.fYa,&d.fZa);//2
fclose(fp);
}
void main(void)
{ CData s={1,2,3,4,5,6};
OutputData("c:\\sdata.out",s);
CData d;
InputData("c:\\sdata.out",d);
OutputData("c:\\cdata.out",d);
}
////[例13.2]fgetc.cpp
# include <stdio.h>
void main(void)
{ FILE* fpGet=fopen("fgetc.cpp","r");
if(fpGet==NULL) {printf("fopen failed\n");return;}
int i=0;
char buffer[512];
while(feof(fpGet)==0 && i<512)
buffer[i++]=fgetc(fpGet);
buffer[i]='\0';
printf("%s\n",buffer);
//fclose(fpGet);
}// 程序運行的結果顯示fgetc.cpp在屏幕上。
///////////////[例13.3]fputc.cpp
# include <stdio.h>
void main(void)
{ FILE* fpGet=fopen("fputc.cpp","r");
if(fpGet==NULL) {printf("fopen failed\n");return;}
FILE* fpPut=fopen("fputc.xpp","w");
if(fpPut==NULL) {printf("fopen failed\n");return;}
while(!feof(fpGet)) //while(feof(fpGet)==0)
fputc(fgetc(fpGet),fpPut);
fclose(fpGet);
fclose(fpPut);
}//程序運行之后即將上面的fputc.cpp源程序轉存到fputc.xpp中。
///////////// [例13.4] fgets.cpp
# include <stdio.h>
void main(void)
{ FILE* fp=fopen("fgets.cpp","r");
if(fp==NULL) {printf("fopen failed\n");return;}
char sBuffer[128];
for(int k=0;k<9;k++)
if(fgets(sBuffer,128,fp)!=NULL) printf("%s",sBuffer);
fclose(fp);
}// 程序運行的結果顯示fgets.cpp在屏幕上。
///////////// [例13.5] fputs.cpp
# include <stdio.h>
void main(void)
{ FILE* fpRead=fopen("fputs.cpp","r");
if(fpRead==NULL) {printf("fopen r failed\n");return;}
FILE* fpWrite=fopen("fputsw.cpp","w");
if(fpWrite==NULL) {printf("fopen w failed\n");return;}
char s[81];
while(!feof(fpRead)) //while(feof(fpRead)==0)
if(fgets(s,81,fpRead)!=NULL)
{ fputs(s,fpWrite); printf("%s",s); }
fclose(fpWrite);
}
//////////// [例13.6]直接隨機方式處理結構變量和數組
#include<stdio.h>
typedef struct SData //聲明一個未含指針成員的結構類型
{ int nLineset; float fAdjust;int nPoint;
float fXa; float fYa; float fZa;
} CData; //同時指定一個該類型的一個別名
void WriteData(CData pSrc[],int n,FILE *fpDst)
{ switch(n) //分支不是必要的僅只是闡明一些概念
{ case 1: //情形1常用于匹配一個簡單的變量
fwrite(pSrc,sizeof(CData),1,fpDst); break;
default: //缺省情形著重數組的處理
fwrite(pSrc,sizeof(CData),n,fpDst);//將內存數組pSrc[n]轉存到fpDst定位的文件
}
}
inline void ReadData(CData* pDst,int n,FILE *fpSrc )
{ fread(pDst,sizeof(CData),n,fpSrc); } //從文件讀數組fpSrc[n]到pDst定位的內存
void PrintData(const CData &d )
{ printf("%4d,%4.1f,%4d,%4.1f,%4.1f,%4.1f\n",
d.nLineset,d.fAdjust,d.nPoint,d.fXa,d.fYa,d.fZa);
}
void main(void)
{ CData s ={0,1,2,3,4,5}; //定義一個簡單變量
CData d[]={1,2,3,4,5,6,
2,3,4,5,6,7,
3,4,5,6,7,8}; //定義一個結構數組
FILE* fpWrite=fopen("c:\\cdata.dat","w"); //打開文件的慣例操作是缺省文本方式
if(fpWrite==NULL) {printf("fopen w failed\n");return;}
WriteData(&s,1,fpWrite); //將結構變量s寫入磁盤
WriteData( d,3,fpWrite); //將結構數組d寫入磁盤
fclose(fpWrite); //及時地進行實際存盤運作
FILE* fpRead=fopen("c:\\cdata.dat","r"); //以缺省方式打開上面剛生成的文件
if(fpRead==NULL) {printf("fopen r failed\n");return;}
CData b[4]; //定義一個有4個元素的結構數組
ReadData(b,3,fpRead); //在文件中先讀取3組結構數據直接送入b[0],b[1],b[2]
ReadData(b+3,1,fpRead); //在文件中隨后位置再讀取1組結構數據直接送入b[3]
for(int k=0;k<4;k++) //在屏幕上循環顯示每一結構元素的成員值
PrintData(b[k]); //二進制數據通過格式轉換以文本輸出
}
/////[例13.7]ftell.cpp
#include<stdio.h>
void main(void)
{ FILE * stream= fopen("ftell.cpp","rb");
double a[20]; fread(a,sizeof(double),20,stream);
printf("%d\n",ftell(stream)); //輸出160
}
//////////[例13.8] 一個簡單的讀寫存盤程序
#include <stdio.h>
#include <stdlib.h>
typedef struct student_tag
{ int num; //成員num可以理解為學號
char name[10]; //字符數組可以理解為姓名
float s[3]; //浮點數組具體意義可以靈活的理解
}STudent;
void Store(FILE*fpRead,int n) //入口參數n用于動態構建結構數組
{ FILE* fpWrite=fopen("STudent.txt","w");// fopen在heap空間建立流文件結構變量
if(fpWrite==NULL) //打開文件的操作是缺省文本方式
{printf("fopen w failed\n");return;}
rewind(fpRead); //反繞到文件的起始處
STudent* ps=new STudent[n]; //定義動態的結構數組ps[n]
while(!feof(fpRead)) //一直讀到文件見底EOF
fread(ps,sizeof(STudent),n,fpRead); //在源中讀取n*sizeof(STudent)到ps
fprintf(fpWrite,"%-6s%-7s%-11s%-8s%-8s%-8s\n",
"order","number","name","math","c++","money"); //格式寫的界面靈活多變
for(int k=0;k<n;k++) //循環輸出結構數組中元素的成員值
fprintf(fpWrite,"%-6d%-6d%-11s%-8.2f%-8.2f%-8.2f\n",k,
ps[k].num,ps[k].name,ps[k].s[0],ps[k].s[1],ps[k].s[2]);
delete [] ps; //釋放自行建立的結構數組空間
fclose(fpWrite); //釋放系統建立的結構變量,信息及時存盤
}
STudent* Produce(int &n) //誕生一個靜態結構數組
{ static STudent s[]={3004,"commom", 70,80,234,
3001,"matchless",100,100,9999, 3009,"prudish", 50,51,815,
3005,"critical", 60,60,60, 3007,"poor", 50,50,0 };
n=sizeof(s)/sizeof(s[0]); //靜態結構數組的維數
FILE* fpWrite=fopen("student.dat","w");//缺省方式寫打開操作
if(fpWrite==NULL)
{printf("fopen w failed\n");exit(0);}
fwrite(s,sizeof(STudent),n,fpWrite); //整齊歸一的入口界面將s[n]送入fpWrite
fclose(fpWrite); //及時關閉文件迅即執行存寫操作
return s; //返回一個局部靜態數組的首地址
}
void Update(FILE*fp,int n) //入口參數n用于指出磁盤空間結構數組的最大維數
{ //更新流文件中相當于結構數組ps[n]中的元素ps[kth]的值
printf("Enter the order num 0-%d to updade \n",n-1);
int kth;
scanf("%d",&kth); //屏幕交互實時地讀入定位的尺數
STudent s; //定義一個局部結構變量s
fseek(fp,kth*sizeof(STudent),SEEK_SET);//定位于距起始位置kth*sizeof(STudent)處
fread(&s,sizeof(STudent),1,fp); //在新定的位置處讀取一段數據到s
Show(&s,kth); //顯示剛讀入的數據
printf("Enter 4 values to updade for number,math,c++,money\n");
scanf("%d,%f,%f,%f",&s.num,&s.s[0],&s.s[1],&s.s[2]);//鍵入四個結構成員值
fseek(fp,kth*sizeof(STudent),SEEK_SET);//定位于結構數組ps[n]中的元素ps[kth]
fwrite(&s,sizeof(STudent),1,fp); //相當于寫到元素ps[kth]中
Show(&s,kth); //顯示更新的數據
}
void Clear(FILE*fp,int n)
{ printf("Enter the order num 0-%d to Clear \n",n-1);
int kth;
scanf("%d",&kth); //屏幕交互實時地讀入定位的尺數
fseek(fp,kth*sizeof(STudent),SEEK_SET);//定位于距起始位置kth*sizeof(STudent)處
STudent s0={0,"",0,0,0}; //定義一個清0的結構變量s0
fwrite(&s0,sizeof(STudent),1,fp); //在新定的位置處存寫s0
fseek(fp,kth*sizeof(STudent),SEEK_SET);//復位于磁盤空間類似于至ps[kth]處
STudent s;
fread(&s,sizeof(STudent),1,fp); //在最新的位置讀數據到結構到變量s
Show(&s,kth); //顯示這個結構變量
}
void Show(STudent *ps,int k) //格式化顯示ps所指的結構的成員值,形參k指出序號
{ printf("%-6s%-7s%-11s%-8s%-8s%-8s\n",
"order","number","name","math","c++","money");
printf("%-6d%-7d%-11s%-8.2f%-8.2f%-8.2f\n",k,
ps->num,ps->name,ps->s[0],ps->s[1],ps->s[2]);
}
int MenuChoice(void) //菜單提示讀取菜單選項值
{ printf("\nEnter choice as bellow:\n"
"1. store a formatted file\n"
"2. update a record\n"
"3. clear a record\n"
"4. end program?\n");
int k;
scanf("%d",&k);
return k;
}
int main()
{ int n;
STudent* ps=Produce(n); //產生一個磁盤文件student.dat
for(int k=0;k<n;k++) //循環顯示結果
Show(ps+k,k);
FILE* fp=fopen("student.dat","r+"); //以讀或寫方式打開已存在的文件
if(fp==NULL)
{printf("fopen r+ failed\n");return 1;}
int menu;
while((menu=MenuChoice())!=4) //選項4跳出循環
{ switch(menu)
{case 1: //選向1用函數Store將格式化的結構數組存儲到STudent.txt文件中
Store(fp,n); break;
case 2: //選向2用函數Update更新下一步選定的數組元素
Update(fp,n); break;
case 3: //選項3用函數Clear將下一步選定的數組元素清0
Clear(fp,n); break;
}
}
fclose(fp); //關閉流文件
return 0;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -