以平实之心写作
writing with simple heart ♬.
C语言基础(十一)- 文件和目录操作运算
KinglyJn
2013-02-26
C\C++关于FILE结构定义说明
//此结构VC定义于stdio.h头文件中,
struct _iobuf {
char *_ptr; //文件输入的下一个位置
int _cnt; //当前缓冲区的相对位置
char *_base; //指基础位置(应该是文件的其始位置)
int _flag; //文件标志
int _file; //文件的有效性验证
int _charbuf; //检查缓冲区状况,如果无缓冲区则不读取
int _bufsiz; //文件的大小
char *_tmpfname; //临时文件名
};
typedef struct _iobuf FILE;
文件的打开、关闭、以及简单读写
# include <stdio.h>
# include <stdlib.h>
int main() {
FILE * open_file(char *, char *);
FILE *fp;
/*
* 向文件中写入字符
* fputc 写入成功返回写入的字符,写入失败返回C语言定义的EOF(符号常量,值为-1)
*/
fp = open_file("C:/Users/kinglyjn/Desktop/test.txt", "a+"); //打开文件
char c = getchar();
while (c!='*') {
fputc(c, fp); //
c = getchar(); //从控制台取到一个字符
}
fclose(fp); //关闭文件
/**
* 从文件中读出字符(文件的打开方式必须为读方式或读写方式)
* 文件结束时,fgetc函数就会返回文件的结束标志EOF(-1)
*/
fp = open_file("C:/Users/kinglyjn/Desktop/test.txt", "r");
c = fgetc(fp);
while (c!=EOF) {
putchar(c); //输出一个字符到控制台
c = fgetc(fp); //
}
fclose(fp);
return 0;
}
//文件打开函数
FILE * open_file(char * filename, char * mode) {
FILE *fp = fopen(filename, mode); //r w a rb wb ab r+ w+ a+ rb+ wb+ ab+ 只读 重写 追加
if (fp==NULL) {
printf("打开失败!\n");
exit(1);
} else {
printf("打开成功!\n");
}
return fp;
}
/*
r 打开只读文件,该文件必须存在
r+ 打开可读写的文件,该文件必须存在
w 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失.若文件不存在则建立该文件
w+ 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失.若文件不存在则建立该文件
a 以附加的方式打开只写文件.若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留
a+ 以附加方式打开可读写的文件.若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留
上述的形态字符串都可以再加一个b字符,如rb、w+b或ab+等组合,加入b 字符用来告诉函数库打开的文件为二进制文件,而非纯文字文件
*/
块读写函数fwrite和fread
# include <stdio.h>
# include <stdlib.h>
typedef struct Student {
char name[10];
float score;
} Stu;
int main() {
FILE * open_file(char *, char *);
FILE *fp;
Stu stus[3] = { {"张三", 22.2}, {"李四", 33.3}, {"王五", 44.4} };
Stu stus2[3];
int len = 3;
//fwrite
//fwrite(buffer,size,count,fp)
//(1)buffer:是一个指针,对fread来说,它是读入数据的存放地址。对fwrite来说,是要输出数据的地址。
//(2)size:要读写的字节数;
//(3)count:要进行读写多少个size字节的数据项;
//(4)fp:文件型指针。
fp = open_file("/Users/zhangqingli/Desktop/test.txt", "w");
for (int i=0; i<len; i++) {
fwrite(&stus[i], sizeof(Stu), 1, fp); //
}
fclose(fp);
//fread
//fread(buffer,size,count,fp)
fp = open_file("/Users/zhangqingli/Desktop/test.txt", "r");
for (int i=0; i<len; i++) {
fread(&stus2[i], sizeof(Stu), 1, fp);
}
fclose(fp);
for (int i=0; i<len; i++) {
printf("%-10s %-5.2f\n", stus2[i].name, stus2[i].score);
}
return 0;
}
//文件打开函数
FILE * open_file(char * filename, char * mode) {
FILE *fp = fopen(filename, mode); //r w a rb wb ab r+ w+ a+ rb+ wb+ ab+ 只读 重写 追加
if (fp==NULL) {
printf("打开失败!\n");
exit(1);
} else {
printf("打开成功!\n");
}
return fp;
}
格式化文件输入和输出函数fprintf和fscanf
- printf/scanf函数的读写对象是终端
- fprintf/fscanf函数的读写对象是磁盘文件
# include <stdio.h>
# include <stdlib.h>
typedef struct {
char name[10];
float score;
} St;
int main() {
FILE * fp;
FILE * open_file(char * filename, char * mode);
//fprintf
fp = open_file("/Users/zhangqingli/Desktop/test.txt", "w");
fprintf(fp, "%s %f", "张三", 23.2);
fprintf(fp, "%s %f", "李四", 23.3);
fprintf(fp, "%s %f", "王五", 23.4);
fclose(fp);
//fscanf
St *stus = (St *) malloc(sizeof(St)*3);
fp = open_file("/Users/zhangqingli/Desktop/test.txt", "r");
int i=0;
while (!feof(fp)) {
fscanf(fp, "%s %f", stus[i].name, &stus[i].score);
i++;
}
fclose(fp);
for (int i=0; i<3; i++) {
printf("姓名:%s 分数:%f\n", stus[i].name, stus[i].score);
}
return 0;
}
//文件打开函数
FILE * open_file(char * filename, char * mode) {
FILE *fp = fopen(filename, mode); //r w a rb wb ab r+ w+ a+ rb+ wb+ ab+ 只读 重写 追加
if (fp==NULL) {
printf("打开失败!\n");
exit(1);
} else {
printf("打开成功!\n");
}
return fp;
}
文件的定位
# include <stdio.h>
# include <stdlib.h>
int main() {
FILE *fp1;
FILE * open_file(const char *, const char *);
fp1 = open_file("/Users/zhangqingli/Desktop/test.txt", "rb");
//把文件的位置指针移动到文件尾
fseek(fp1, 0, SEEK_END);
//获取文件当前指针的位置
long len = ftell(fp1); //根据前面的操作可获取文件的长度
printf("文件的大小为:%ld 字节\b", len);
return 0;
}
FILE * open_file(const char * filename, const char * mode) {
FILE *fp = fopen(filename, mode);
if (fp==NULL) {
printf("文件打开时出错!\n");
exit(1);
}
return fp;
}