一、常用函数
二、文件指针,指向文件的指针
FILE *fp;
三、文件的打开与关闭
FILE *fp = fopen(文件名,使用文件方式)
如:FILE *fp = NULL;
fp = fopen(” file.txt”,”r”);//r 表示读文件
int result = fclose(fp) ;// =0,如果不等于0,表示发生错误
四、读写方式
五、补充:
\0 :表示字符串结束
\n :表示回车换行
EOF :表示文件的末尾
六、关于中文读取
因为一个汉字占三个字节,一个字节等于8位
在C语言里每个字符串结束时都以\0
所以在读取的时候不能只读三个,会乱码
FILE *fp = fopen(“a.txt”,”r”);
//a.txt里存放的是中文
错误代码如:
char ch[3] ;
fgets(ch,3, fp);
printf("%s\n",ch);
正确代码如:
char ch[4] ;
fgets(ch,4, fp);
printf("%s\n",ch);
七、示例代码1
#include <stdio.h>
#include <string.h>
int main(int argc, const char * argv[])
{
//定义文件指针
FILE *fw = NULL;
fw = fopen("a.txt", "w");
char ch[7] = "abcdefg";
if (fw != NULL) {
//写入
for(int i = 0 ; i <strlen(ch); i ++ ){
printf("%c\t",ch[i]);
fputc(ch[i], fw);
}
}else{
printf("写入失败!");
getchar();
exit(1);
}
printf("\n");
FILE *fr = NULL;
fr = fopen("a.txt", "r");
if(fr != NULL){
char c = fgetc(fr);
//读取
while(c != EOF){
putchar(c);
c = fgetc(fr);
}
}else{
printf("读取失败!");
getchar();
exit(1);
}
//fclose(fw);
//fclose(fr);
printf("\n");
return 0;
}
七、示例代码2
#include <stdio.h>
#include <string.h>
int main(int argc, const char * argv[])
{
//定义文件指针
FILE *fp = NULL;
fp = fopen("a.txt", "a+");
if (fp != NULL) {
//写入
printf("请输入字符");
char ch = getchar();
int count = 0;
while(ch !='\n'){
count ++;
fputc(ch,fp);
ch = getchar();
}
fclose(fp);
printf("\n");
//把指针移到开始位置
rewind(fp);
//读取数据
ch = fgets(fp);
while(ch != EOF){
putchar(ch);
ch = fgets(fp);
}
}else{
printf("写入失败!");
getchar();
exit(1);
}
printf("\n");
return 0;
}
八、fread与fwrite函数
1)fread(buffer,size,count,fp);
2)fwrite(buffer,size,count,fp):
示例代码:
fwrite写入数据
FILE *fp =fopen("a.txt","wb");
if(fp !=NULL){
char *ch = "kkkkkkk\n";
fwrite(ch,1,strlen(ch),fp);
fwrite(ch,1,strlen(ch),fp);
}else{
printf("写入失败!");
getchar();
exit(1);
}
fclose(fp);
fread读取数据
FILE *fp =fopen("a.txt","rb");
if(fp !=NULL){
char ch[100];
fread(ch,1,sizeof(ch),fp);
printf("%s\n",ch);
}else{
printf("写入失败!");
getchar();
exit(1);
}
fclose(fp);
九、结构体的读写
#include <stdio.h>
struct Student{
char name[20];
int age;
float score;
};
int main(int argc, const char * argv[])
{
// 定义数组
struct Student stu[3] ={{"tom",22,89},{"kite",34,67},{"jelly",21,90}};
FILE *fp = fopen("stu.data", "wb+");
if(fp !=NULL){
for(int i =0; i < 3; i++){
fwrite(&stu[i],sizeof(struct Student),1,fp);
}
printf("写入成功!\n");
rewind(fp);
struct Student s[3];
for(int i = 0; i < 3; i++){
fread(&s[i],sizeof(struct Student),1,fp);
printf("%s\t",s[i].name);
}
}
fclose(fp);
printf("\n\n");
return 0;
}
十、fscanf和fprintf的用法
示例1
#include <stdio.h>
int main(int argc, const char * argv[])
{
// 写入 9##2;到文件 test.txt
int a = 9;
int b = 2;
FILE *fp = fopen("text.txt","w+");
if(fp != NULL){
fprintf(fp, "%d##%d;", a,b);
rewind(fp);
int m=0;
int n=0;
fscanf(fp, "%d##%d;",&m,&n);
printf("m=%d,n=%d",m,n);
}
printf("\n");
return 0;
}
示例2
#include <stdio.h>
/**
读写如下文件
1,2#
3,4#
5,6#
*/
int main(int argc, const char * argv[])
{
// 定义数组
char ch[3][2] = {1,2,3,4,5,6};
//定义指针
FILE *fp = fopen("a.txt", "w+");
//
if (fp!=NULL) {
//写入
for (int i = 0; i <3; i ++) {
fprintf(fp, "%d,%d#",ch[i][0],ch[i][1]);
}
printf("写入成功\n");
rewind(fp);
//读取
int arr[3][2];
for (int i = 0; i <3; i ++) {
fscanf(fp, "%d,%d#",&arr[i][0],&arr[i][1]);
printf("%d,%d",arr[i][0],arr[i][1]);
}
}
fclose(fp);
return 0;
}
十一、文件随机读取,定位fseek
fseek(fp,curPosition,headPosition);
如:fseek(fp,100L,0);
文件首:SEEK_SET 0
当前位置:SEEK_CUR 1
文件尾部:SEEK_END 2
示例:读取第二个学生的成绩
#include <stdio.h>
struct Student{
char name[20];
int age;
float score;
};
int main(int argc, const char * argv[])
{
// 定义数组
struct Student stu[3] ={{"tom",22,89},{"kite",34,67},{"jelly",21,90}};
FILE *fp = fopen("stu.data", "wb+");
if(fp !=NULL){
for(int i =0; i < 3; i++){
fwrite(&stu[i],sizeof(struct Student),1,fp);
}
printf("写入成功!\n");
//定位到第二个学生
fseek(fp,sizeof(struct Student),SEEK_SET);
fread(&stu,sizeof(struct Student),1,fp);
printf("%s\t",stu.name);
}
}
fclose(fp);
printf("\n\n");
return 0;
}