文件操作
首先我们使用c语言创建一个文件
int main(void) { FILE *fp; fp = fopen("test.c","w"); fclose(fp); return 0; }
fopen
FILE *fopen(const char *pathname, const char *mode);
pathname 是你要打开的文件的名字,比如上面例子中的"test.c"
mode 是你要打开的模式,有以下几种可以选择:c语言文件打开模式
所以我们使用w打开一个原本不存在的文件,那么就会新建一个名为test.c的文件
fclose
int fclose(FILE *stream);
stream 参数就填文件描述符
所有打开的文件在程序结束之前都必须要关闭。
还有一个比较霸道的函数
fcloseall
int fcloseall(void);
直接关闭所有打开的文件。
那接下来我想在新建的这个文件里写点东西,可以这样
int main(void) { FILE *fp; fp = fopen("test.c","w"); fprintf(fp,"%s\n","hello everyone"); fclose(fp); return 0; }
在查看test.c的内容时,就能看到已经写进去了hello everyone
当然也可以这样做
int main(void) { FILE *fp; fp = fopen("test.c","w"); fputs("hello everyone 123\n",fp); fclose(fp); return 0; }
也同样可以写进去hello everyone 123
fprintf
int fprintf(FILE *stream, const char *format, ...);
stream 文件描述符
后面的参数用法和printf一样
fputs
int fputs(const char *s, FILE *stream);
s 你要写入的内容(字符串)
stream 文件描述符
同样还有写入单个字符的函数
fputc
int putc(int c, FILE *stream);
那么如果我想直接在代码中读取文件内容呢?
int main(void) { char tmp[100]; FILE *fp; fp = fopen("test.c","rw"); fputs("hello everyone 123\n",fp); fscanf(fp,"%s",tmp); printf("%s\n",tmp); fclose(fp); return 0; }
也可以这样
int main(void) { char tmp[100]; FILE *fp; fp = fopen("test.c","rw"); fputs("hello everyone 123",fp); fgets(tmp,20,fp); // fscanf(fp,"%s",tmp); printf("%s\n",tmp); fclose(fp); return 0; }
这里我打开方式变成了 rw 因为现在我要从文件中读取数据 所以只有w是读不出来的
fscanf
int fscanf(FILE *stream, const char *format, ...);
stream 文件描述符
其他参数和scanf用法相同
和 scanf 不同的是,scanf 是从键盘输入,要想 fscanf 也从键盘输入,则第一个参数可以写 stdin
要想用 fprintf 实现 printf 的效果,则第一个参数为 stdout
fgets
char *fgets(char *s, int size, FILE *stream);
s 读出数据存放的位置
size 读多少个数据
stream 文件描述符
fgetc
int fgetc(FILE *stream);
fgetc每读取一个字符后,将光标向后移动一位,可以继续读取下一个字符,若读取失败(最后一位) 返回值为EOF
fread
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
ptr 读取的数据存放地址
size 每次读多少字节
nmemb 读多少次
stream 文件描述符
fwrite
size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);
ptr 要写入的数据存放的地址
其他参数和fread相同
使用fread读数据:
#include <stdio.h> #include <string.h> int main(void) { int a; char tmp[100]; FILE *fp; fp = fopen("test.c","r+"); fread(tmp,5,1,fp); puts(tmp); memset(tmp,0,100); a = fread(tmp,1,8,fp); puts(tmp); printf("%d\n",a); fclose(fp); return 0; }
输出结果
hello everyone 8
第一次1次性读了5个字节,读一次,所以输出hello
第二次分成8次,每次读1个字节,输出everyone
返回值为实际读取的元素的个数
#include <stdio.h> #include <string.h> int main(void) { int a; char tmp[100]; char *tmp2 = "hello china"; FILE *fp; fp = fopen("test.c","r+"); fread(tmp,5,1,fp); puts(tmp); memset(tmp,0,100); a = fread(tmp,1,8,fp); puts(tmp); printf("%d\n",a); fwrite(tmp2,1,8,fp); fclose(fp); return 0; }
输出结果为
helloeveryonehello ch
写入8次,每次1个字节,没有问题
但是覆盖了原来的helloeveryone123
这和我们的打开方式无关
只要是用fwrite 如果在数据中间写,那就必然会覆盖后面的内容