13.标准C库对文件操作引入
linux 和标准C库文件操作对比:
https://www.cnblogs.com/NickyYe/p/5497659.html
14.标准c库打开创建文件读写文件光标移动
fopen,fwrite,fread代码使用方式(demo19.c)
#include <stdio.h>
#include <string.h>
int main()
{
//FILE *fopen(const char *pathname, const char *mode);
FILE *fp;
char *str = "chenLiChen hen shuai";
char readBuf[128] = {0};
fp = fopen("./chen.txt","w+");//*注意这里第二个参数是字符串因为是指针所以用字符串形式
//size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);
//ptr buf 要写的数据的缓存(第一个参数)
//size sizeof char(数据的长度)
//geshu 写几个(有时写1就是一个字符串写入)
//which file 在哪个文件操作
fwrite(str,sizeof(char),strlen(str),fp);//一个字节一个字节的写入
//fwrite(str,siazeof(char)*strlen(str),1,fp);字符串写入一次性写那么多
fseek(fp,0,SEEK_SET);
//size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
fread(readBuf,sizeof(char),strlen(str),fp);//这里是多次字节的读
//fread(readBuf,sizeof(char)*strlen(str),1,fp);(就修改了一次性读这个函数,在demo20.c)
printf("read data: %s\n",readBuf);
return 0;
}
~
运行结果图(chen.txt创建成功没有截图)
15.标准c库写入结构体到文件
补充上节课的内容(demo21.c):
#include <stdio.h>
#include <string.h>
int main()
{
//FILE *fopen(const char *pathname, const char *mode);
FILE *fp;
char *str = "chenLiChen hen shuai";
char readBuf[128] = {0};
fp = fopen("./chen.txt","w+");
//size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);
//ptr buf
//size sizeof char
//geshu
//which file
int nwrite = fwrite(str,sizeof(char),100,fp);//注意:write和read函数的返回值不是和写入多少个实际值有关,其大小取决与第三个形参的值,这个参数多大,返回值就多大,如下图截图可视。
//fwrite(str,siazeof(char)*strlen(str),1,fp);
fseek(fp,0,SEEK_SET);
//size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
int nread = fread(readBuf,sizeof(char),strlen(str),fp);//read的话其返回值大小是取决于第三个参数,但是它的第三个个数不能大于write的个数,如果大于write的个数其返回值也只能最大等于write的返回值(demo22.c可看)。
printf("read data: %s\n",readBuf);
printf("n_read:%d , nwrite:%d\n",nread,nwrite);
return 0;
}
这是以上代码运行的结果:
把结构体写入文件(demo23.c)
#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("./file1","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,data=%d,char=%c\n",n_read,data2.a,data2.c);
fclose(fp);
return 0;
}
下图是运行看结果:
16.文件其它函数讲解及文件收尾
fputc 用法(demo24.c):
#include <stdio.h>
#include <string.h>
int main()
{
FILE *fp;
int i;
char *str = "zhanglong hen shuai a!";
int len;
len = strlen(str);//这里不直接用strlen(str)直接放在for那,是因为每次循环再计算的时候str++会影响到,所以用len先赋值。注意这些细节
fp = fopen("./test.txt","w+");
for(i=0;i<len;i++){
fputc(*str,fp);//fputc一次只能写一个字符给文件,所以用循环语句写操作。
str++;
}
fclose(fp);
return 0;
}
下图是运行结果(test.txt文件成功被写入):
feof 用来判断是否到达文件尾,如果没有到达文件尾巴,这个函数的返回值为0,到达文件尾巴就变成0了;fgetc(fp)就只需要一个文件描述符传参,返回值是读到的数据。
#include <stdio.h>
#include <string.h>
int main()
{
FILE *fp;
char c;
fp = fopen("./test.txt","r");
while(!feof(fp)){//这里判断是个细节,feof读到不是尾巴的时候返回值是0,那么就不可能执行while的循环,所以取反,当到达尾巴是非0,取反变成0,跳出循环。
c = fgetc(fp);
printf("%c",c);
}
fclose(fp);
return 0;
}
上面的实际当中fputc、feof、fgetc用的比较少,多了解一些。