@SuHongjun
2020-05-07T07:31:30.000000Z
字数 5438
阅读 139
C语言
未分类
文件操作示例:
#include "stdio.h"
main()
{
FILE *fp; //定义文件指针
//struct _iobuf *fp2;
fp = fopen("H.txt","w"); //打开文件
fprintf(fp,"Hello world!\n"); //对文件进行读、写
fclose(fp); //关闭文件
}
/*
文件操作4部曲:
定义文件指针
打开文件
对文件进行读、写
关闭文件
*/
struct _iobuf {
char *_ptr;
int _cnt;
char *_base;
int _flag;
int _file;
int _charbuf;
int _bufsiz;
char *_tmpfname;
};
typedef struct _iobuf FILE;
fopen() 函数的打开方式:FILE *fopen(char *filename, char *mode);
filename为文件名(包括文件路径),mode为打开方式,它们都是字符串。
整体来说,文件打开方式由 r、w、a、+、t、b 六个字符拼成
r、w、a、+表示读写权限:
r: read,读
w: write,写
a: append,追加
+: 读和写
t、b表示读写方式:
t: text,文本文件,读写方式的默认值
b: binary,二进制文件
读写权限和读写方式可以组合使用,组合方式为以下2种方式之一:
调用 fopen() 函数时必须指明读写权限,但是可以不指明读写方式(此时默认为"t")。
控制读写权限的字符串(必须指明):
打开方式 | 说明 |
---|---|
"r" | 以“只读”方式打开文件。只允许读取,不允许写入。文件必须存在,否则打开失败。 |
"w" | 以“写入”方式打开文件。如果文件不存在,那么创建一个新文件;如果文件存在,那么清空文件内容(相当于删除原文件,再创建一个新文件)。 |
"a" | 以“追加”方式打开文件。如果文件不存在,那么创建一个新文件;如果文件存在,那么将写入的数据追加到文件的末尾(文件原有的内容保留)。 |
"r+" | 以“读写”方式打开文件。既可以读取也可以写入,也就是随意更新文件。文件必须存在,否则打开失败。 |
"w+" | 以“写入/更新”方式打开文件,相当于w和r+叠加的效果。既可以读取也可以写入,也就是随意更新文件。如果文件不存在,那么创建一个新文件;如果文件存在,那么清空文件内容(相当于删除原文件,再创建一个新文件)。 |
"a+" | 以“追加/更新”方式打开文件,相当于a和r+叠加的效果。既可以读取也可以写入,也就是随意更新文件。如果文件不存在,那么创建一个新文件;如果文件存在,那么将写入的数据追加到文件的末尾(文件原有的内容保留)。 |
控制读写方式的字符串(可以不写):
打开方式 | 说明 |
---|---|
"t" | 文本文件。如果不写,默认为"t"。 |
"b" | 二进制文件。 |
写:fprintf()、fputs(),fgetc()
读:fscanf()、fgets(),fgetc()
判断是否到文件末尾:feof()
各函数的原型:
//int feof(FILE *fp); //【返回值】检测到文件结束标识返回1,否则返回0。
格式化读写文件:
//int fscanf ( FILE *fp, char * format, ... );
//int fprintf ( FILE *fp, char * format, ... );
以字符串的形式读写文件:
//char *fgets ( char *str, int size, FILE *fp );
//int fputs( char *str, FILE *fp );
以字符形式读写文件:
//int fgetc(FILE *fp);
int fputc ( int ch, FILE *fp );
应用实例:
#include "stdio.h"
main()
{
FILE *fp;
char buf[300];
int readCount;
fp = fopen("格式化读写文件.txt","wt");
fprintf(fp,"格式化读写文件:\n");
fprintf(fp,"//int fscanf ( FILE *fp, char * format, ... );\n");
fprintf(fp,"//int fprintf ( FILE *fp, char * format, ... );\n");
fclose(fp);
fp = fopen("格式化读写文件.txt","rt");
readCount = fscanf(fp,"%s",buf);
printf("%s\n",buf);
readCount = fscanf(fp,"%s",buf);
printf("%s\n",buf);
readCount = fscanf(fp,"%s",buf);
printf("%s\n",buf);
//fscanf()读入并显示的内容和fprintf()输出的内容并不一致
}
/*
以字符串的形式读写文件:
char *fgets ( char *str, int size, FILE *fp );
int fputs( char *str, FILE *fp );
*/
#include "stdio.h"
main()
{
FILE *fp;
char buf[300];
int readCount;
fp = fopen("以字符串的形式读写文件.txt","wt");
fputs("格式化读写文件:\n",fp); //fputs()并不会自动附加换行符
fputs("char *fgets ( char *str, int size, FILE *fp );\n",fp);
fputs("int fputs( char *str, FILE *fp );\n",fp);
fclose(fp);
fp = fopen("以字符串的形式读写文件.txt","rt");
fgets(buf,300,fp);
printf("%s",buf);
fgets(buf,300,fp);
printf("%s",buf);
fgets(buf,300,fp);
printf("%s",buf);
}
//写
#include "stdio.h"
main()
{
FILE *fp; //定义文件指针
fp = fopen("Hello.txt","w"); //打开文件
fprintf(fp,"===================================\n"); //对文件进行读、写
fprintf(fp,"Hello world!\n"); //对文件进行读、写
fprintf(fp,"===================================\n"); //对文件进行读、写
fprintf(fp,"欢迎来昆明做客!\n"); //对文件进行读、写
fclose(fp); //关闭文件
}
#include "stdio.h"
main()
{
FILE *fp;
char buf[200];
fp = fopen("Hello.txt","r");
while(!feof(fp))
{
fgets(buf,200,fp); //char *fgets(char *s, int size, FILE *stream);
puts(buf);
}
fclose(fp);
}
#include "stdio.h"
main()
{
FILE *fp;
char buf[200], c;
fp = fopen("Hello.txt","r");
while(!feof(fp))
{
fscanf(fp,"%s",buf); //int fscanf(FILE *stream, char *format,[argument]);
printf("%s\n",buf);
}
fclose(fp);
}
#include "stdio.h"
main()
{
FILE *fp;
char buf[200], c;
fp = fopen("Hello.txt","r");
if( fp != NULL )
{
while( (c = fgetc(fp)) != EOF ) //int fgetc(FILE * stream);
putchar(c);
}
printf("\n");
fclose(fp);
}
.............
#include "stdio.h"
struct BOOK //结构体类型定义,BOOK是类型名,定义的新类型是:struct BOOK类型
{
char ISBN[50]; //结构体的成员
char bookName[100];
char author[100];
float price;
int soldCount;
};
void InputBookInfo(struct BOOK *b);
void outPutToScreen(struct BOOK *b);
void outPutToTxt(struct BOOK *b);
void outPutToDB(struct BOOK *b);
void GetBookInfoFromDB(struct BOOK *b);
main()
{
struct BOOK b[100]; //b是一个结构体数组,数组元素的类型是:struct BOOK
GetBookInfoFromDB(b);
//InputBookInfo(b);
outPutToScreen(b);
//outPutToTxt(b);
//outPutToDB(b);
}
void GetBookInfoFromDB(struct BOOK *b)
{
FILE *fp;
int i;
fp = fopen("books.db","rb");
fread(b,sizeof(struct BOOK) *3,1,fp);
fclose(fp);
}
void InputBookInfo(struct BOOK *b)
{
int i;
char buff[100];
printf("请录入图书信息:\n");
for(i=0; i<3; i++)
{
printf("第%d本书--ISBN:",i+1);
gets(b[i].ISBN); //b[i].ISBN 是数组名
printf("第%d本书--书名:",i+1);
gets(b[i].bookName); //b[i].bookName 是数组名
printf("第%d本书--作者:",i+1);
gets(b[i].author); //b[i].author 是数组名
printf("第%d本书--售价:",i+1);
scanf("%f",&b[i].price); //b[i].price 是float型
printf("第%d本书--售出数量:",i+1);
scanf("%d",&b[i].soldCount); //b[i].soldCount 是int型
gets(buff);
}
}
void outPutToScreen(struct BOOK *b)
{
int i;
printf("已录入的图书信息:\n");
printf("===============================================================\n");
printf(" ISBN\t\t书名\t作者\t售价\t售出数量\n");
printf("---------------------------------------------------------------\n");
for(i=0; i<3; i++)
printf(" %s\t%s\t%s\t%.2f\t%5d\n",
b[i].ISBN,
b[i].bookName,
b[i].author,
b[i].price,
b[i].soldCount);
printf("===============================================================\n");
}
void outPutToDB(struct BOOK *b)
{
FILE *fp;
int i;
fp = fopen("books.db","wb");
fwrite(b,sizeof(struct BOOK) *3,1,fp);
fclose(fp);
}
void outPutToTxt(struct BOOK *b)
{
FILE *fp;
int i;
fp = fopen("books.txt","w");
fprintf(fp,"已录入的图书信息:\n");
fprintf(fp,"===============================================================\n");
fprintf(fp," ISBN\t\t书名\t作者\t售价\t售出数量\n");
fprintf(fp,"---------------------------------------------------------------\n");
for(i=0; i<3; i++)
fprintf(fp," %s\t%s\t%s\t%.2f\t%5d\n",
b[i].ISBN,
b[i].bookName,
b[i].author,
b[i].price,
b[i].soldCount);
fprintf(fp,"===============================================================\n");
fclose(fp);
}