fopen的原型
FILE *fopen(const char *path, const char *mode);
path是C字符串,包含要打开的文件名称。
mode是C字符串,包含文件访问模式,如下:
“r” :打开一个用于读取的文件。该文件必须存在。
“w” :创建一个用于写入的空文件。如果文件名称与已存在的文件相同,则会删除已有文件的内容,文件被视为一个新的空文件。
“a” :追加到一个文件。写操作向文件末尾追加数据。如果文件不存在,则创建文件。
“r+” :打开一个用于更新的文件,可读取也可写入。该文件必须存在。
“w+” :创建一个用于读写的空文件。
“a+” :打开一个用于读取和追加的文件。
fwrite和fread的原型
#include <stdio.h>
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);
ptr – 这是指向要被写入的元素数组的指针。
size – 这是要被写入的每个元素的大小,以字节为单位。
nmemb – 这是元素的个数,每个元素的大小为 size 字节。
stream – 这是指向 FILE 对象的指针,该 FILE 对象指定了一个输出流。
关于光标的位置
原型int fseek(FILE *stream, long offset, int whence);
与lseek()的运用相同
实列
#include<stdio.h>
#include<string.h>
int main()
{
FILE *fp;
char *str="Linux study";
char readBuf[128]={0};
fp=fopen("./file.text","w+");//创建一个用于读写的空文件
fwrite(str,sizeof(char),strlen(str),fp);
fseek(fp,0,SEEK_SET);//将光标移动到头在进行读取
fread(readBuf,sizeof(char),strlen(str),fp);
printf("rend data: %s\n",readBuf);
fclose(fp);
return 0;
}
关于fwrite和fread的返回值
fwrite的返回值:如果成功,该函数返回一个 size_t 对象,表示元素的总数,该对象是一个整型数据类型。该数字与 nmemb 参数相同。
fread的返回值:成功读取的元素总数会以 size_t 对象返回,size_t 对象是一个整型数据类型。如果总数与 nmemb 参数不同,则可能发生了一个错误或者到达了文件末尾。
实列
#include<stdio.h>
#include<string.h>
int main()
{
FILE *fp;
char *str="Linux study";
char readBuf[128]={0};
fp=fopen("./file.text","w+");
// int nwrite=fwrite(str,sizeof(char),strlen(str),fp);
int nwrite=fwrite(str,sizeof(char),100,fp);
fseek(fp,0,SEEK_SET);
int nread=fread(readBuf,sizeof(char),strlen(str),fp);
printf("rend data: %s\n",readBuf);
printf("read=%d,write=%d\n",nread,nwrite);
fclose(fp);
return 0;
}
缓冲区为结构体
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<stdio.h>
#include<unistd.h>
#include<string.h>
#include<stdlib.h>
struct Test
{
int a;
char c;
};
int main()
{
FILE *fp;
struct Test data={100,'a'};
struct Test data2;
fp=fopen("./file","w+");
int n_write= fwrite(&data,sizeof(struct Test),1,fp);//注意第一个参数要记得加上取地址符号&,第二个参数是整个结构体的大小
fseek(fp,0,SEEK_SET);
int n_read=fread(&data2,sizeof(struct Test),1,fp);
printf("read %d,%c\n",data2.a,data2.c);
fclose(fp);
return 0;
}
fputc()、fgetc()和feof()的用法
fputc()的用法
#include<stdio.h>
#include<string.h>
int main()
{
FILE *fp;
int i;
char *str="Linux study study";
int len=strlen(str);
fp=fopen("./test.txt","w+");
for(i=0;i<len;i++)
{
fputc(*str,fp);
str++;
}//将str中的内容写入到test.txt中
fclose(fp);
return 0;
}
fgetc()和feof()的用法
#include<stdio.h>
#include<string.h>
int main()
{
FILE *fp;
int i;
char c;
fp=fopen("./test.txt","r");//只读方式打开,test.txt已经存在,并且已有内容
while(!feof(fp)){
c=fgetc(fp);
printf("%c",c);
}
fclose(fp);
return 0;
}
fputc()、fgetc()和feof()的结合
注意:光标的位置
#include<stdio.h>
#include<string.h>
int main()
{
FILE *fp;
int i;
char *str="Linux study study";
int len=strlen(str);
char c;
fp=fopen("./test.txt","w+");
for(i=0;i<len;i++)
{
fputc(*str,fp);
str++;
}//将str中的内容写入到test.txt中
fseek(fp,0,SEEK_SET);
while(!feof(fp)){test.txt
c=fgetc(fp);
printf("%c",c);
}//将test.txt文件中的内容读取到c中
fclose(fp);
return 0;
}