// 引入库
#include
// 文件结构体 定义一个文件指针
FILE *fp;
// 打开一个文件
fp = fopen("F:\\test.txt","r+");
文件打开方式
# "r":只能从文件中读数据,该文件必须先存在,否则打开失败
# "w":只能向文件写数据,若指定的文件不存在则创建它,如果存在则先删除它再重建一个新文件
# "a":向文件增加新数据(不删除原有数据),若文件不存在则打开失败,打开时位置指针移到文件末尾
# "r+":可读/写数据,该文件必须先存在,否则打开失败
# "w+":可读/写数据,用该模式打开新建一个文件,先向该文件写数据,然后可读取该文件中的数据
# "a+":可读/写数据,原来的文件不被删去,位置指针移到文件末尾
// 关闭文件
fclose(fp);
如果不关闭文件,则可能造成文件的损坏。
测试
#include
#include
int main(){
// 定义文件指针
FILE *fp;
// 打开一个文件
fp = fopen("F:\\test.txt","r+");
if(fp==NULL){
printf("文档打开失败!");
}else {
printf("文档打开成功!");
// 关闭文件
fclose(fp);
}
return 0;
}
char ch = 0;
// 读出一个字符
ch = fgetc(fp);
printf("%c",ch);
ch = fgetc(fp);
printf("读出的字符为:%c\n",ch);
ch = fgetc(fp);
printf("读出的字符为:%c\n",ch);
读出文件中所有字符
ch = fgetc(fp);
while(!feof(fp)){ // feof ---- endof 判断是否读到了文件的结束标志,如果读到了返回1,否则返回0
printf("读出来的字符为:%c\n",ch);
ch = fgetc(fp);
}
读出文件数据 fread
fread(&class7[4],sizeof(STU),1,fp);
读出文件的数据,是从光标所处位置向后进行读出的。并不是从文件的开头读出。
如果我们想从文件开头进行读文件,可以使用文件定位函数fseek()
int fseek(FILE *stream,long offset,int whence);
whence参数值选择:
# SEEK_SET 从文件头开始偏移,offset>=0
# SEEK_CUR 从当前位置开始偏移,offset可正可负
# SEEK_END 从文件结尾,offset可正可负
测试:
// 向文件中写数据
fwrite(&class7[0],sizeof(STU),1,fp);
fseek(fp,0,SEEK_SET);
// 从文件中读数据
fread(&class7[4],sizeof(STU),1,fp);
printf("姓名:%s\n",class7[4].name);
printf("手机号码:%s\n",class7[4].tel);
// 写入一个字符
ch = fputc('D',fp);
if(ch == -1){
printf("写入失败");
}else {
printf("写入成功");
}
写入字符,会覆盖!!
向文件中写入数据
写完数据后,光标会在写入的数据的末尾!
#include
#include
typedef struct{
char name[24];
char tel[20];
}STU;
int main(){
FILE *fp = fopen("F:\\test.txt","r+");
STU class7[5] = {
{"张三","10086"},
{"李四","10010"},
{"王五","110"}
};
if(fp==NULL){
printf("文件打开失败!\n");
}else {
printf("文件打开成功!\n");
// 向文件中写数据
fwrite("姓名:",sizeof("姓名:"),1,fp);
fwrite(&class7[0],sizeof(STU),1,fp);
fclose(fp);
}
return 0;
}
当我们写入数据为两块时:
fwrite(&class7[0],sizeof(STU),2,fp);