内容概要
一、打开和关闭文件
二、打开文件的几种模式
三、文本模式:fputc,fgetc,fputs,fgets
四、二进制模式:fwrite,fread
五、文件操作小练习
1、打开和关闭文件
fopen(字符串参数一,字符串参数二);
功能:打开文件
参数:参数一,文件名,可以是相对路径,也可以是绝对路径,默认为当前路径
参数二,打开文件的模式(注意这里必须是字符串而不是字符)
返回值:文件指针或NULL
fclose(文件指针)
功能:关闭文件
返回值:整形(应该用于表示函数是否执行成功)
使用typedef类型FILE *定义文件指针
#include <stdio.h> #include <stdlib.h> int main(void){ FILE *pfp; pfp = fopen("hello.txt", "w"); if (pfp == NULL){ printf("open file error!\n"); //文件打开失败时返回NULL exit(EXIT_FAILURE); } fclose(pfp); pfp = NULL; //pfp依旧存有文件的地址,但是那个空间已经被释放了 return 0; }
注意:和python的open()函数一样,fopen()只是向操作系统发送打开文件的请求,如果不使用fclose,那么这部分资源不会被操作系统释放,即使你关闭了可执行程序
2、打开文件的几种模式
c语言文件打开的模式与python是一样的
r | 以只读方式打开文件,该文件必须存在。 |
r+ | 以读/写方式打开文件,该文件必须存在。 |
rb+ | 以读/写方式打开一个二进制文件,只允许读/写数据。 |
rt+ | 以读/写方式打开一个文本文件,允许读和写。 |
w | 打开只写文件,若文件存在则长度清为0,即该文件内容消失,若不存在则创建该文件。 |
w+ | 打开可读/写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。 |
a | 以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留(EOF符保留)。 |
a+ | 以附加方式打开可读/写的文件。若文件不存在,则会建立该文件,如果文件存在,则写入的数据会被加到文件尾后,即文件原先的内容会被保留(原来的EOF符 不保留)。 |
wb | 以只写方式打开或新建一个二进制文件,只允许写数据。 |
wb+ | 以读/写方式打开或建立一个二进制文件,允许读和写。 |
wt+ | 以读/写方式打开或建立一个文本文件,允许读写。 |
at+ | 以读/写方式打开一个文本文件,允许读或在文本末追加数据。 |
ab+ | 以读/写方式打开一个二进制文件,允许读或在文件末追加数据。 |
默认情况下为t文本模式
"w" => "wt"
二进制和文本模式的区别:
在windows系统中,文本模式下,文件以"\r\n"代表换行。若以文本模式打开文件,并用fputs等函数写入换行符"\n"时,函数会自动在"\n"前面加上"\r"。即实际写入文件的是"\r\n" 。
在类Unix/Linux系统中文本模式下,文件以"\n"代表换行。所以Linux系统中在文本模式和二进制模式下并无区别。
在mac操作系统下,文本模式以\r表示换行,fputs等函数写入换行符"\n"时,会被替换为\r。
如果以二进制模式打开,三种操作系统没有区别?
c语言在文件末尾处会添加一个结束符EOF(-1)表示文件已经读取完毕
3、文本模式
fputc(整形表示字符常量的ascii编码值,文件指针)
// file put char的意思
功能:往文件中添加一个字符
返回值:整形
fgetc(文件指针)
// flie get char的意思
功能:从文件中拿取一个字符
返回值:字符常量的ascii编码值
#include <stdio.h> #include <stdlib.h> int main(void){ FILE *file; int ch; file = fopen("hello.txt", "r"); if (file == NULL){ printf("open file error!\n"); exit(EXIT_FAILURE); } /*while ((ch = fgetc(file)) != EOF){ printf("%c", ch); }*/ do { ch = fgetc(file); if (ch == EOF){ printf("%d", ch); } } while (ch != EOF); putchar(‘\n‘); fclose(file); file = NULL; return 0; }
fputs(字符指针或数组,文件指针)
// file put string的意思
功能:往文件中写入一个字符串,字符串自动添加的\0会被忽略
返回值:整形
fgets(字符指针或者数组,读取字符的数量size,文件指针)
// file get string的意思
功能:往文件种读取一个字符串
参数:参数一,参数一用于存放得到字符串
参数二,参数二用于限制读取到的字符数量,注意读取到的字符串会自动加上\0,所以实际得到的字符数量为(size-1),同时size-1表示读取的最大字符数量,如果在读取过程中遇到\n,则结束读取
4、二进制模式:fread,fwrite
文本模式下的文件中的数据本质还是二进制方式存储的,只是中间做了一层转换,变成人能识别的字符(英语符号,汉语,日语,法语等)
这个转换关系就是字符编码
fread
fwrite
以二进制模式写入文件,以文本模式读取内容
#include <stdio.h> #include <stdlib.h> int main(void){ FILE *file; int a = 67, *pa = &a; int ch; file = fopen("hello.txt", "wb"); if (file == NULL){ printf("open file error!\n"); exit(EXIT_FAILURE); } fwrite(pa, 4, 1, file); fclose(file); file = NULL; file = fopen("hello.txt", "r"); if (file == NULL){ printf("open file error!\n"); exit(EXIT_FAILURE); } ch = fgetc(file); printf("%c\n", ch); fclose(file); file = NULL; return 0; }
一个插入创建文件并且传入字符串的小功能
#include <stdio.h> void un_user_char(void); void put_str(FILE *); void un_user_char(void){ while (getchar() != ‘\n‘){ ; } } void put_str(FILE *file){ char str[1024]; printf("please input a string:"); scanf("%s", str); fputs(str, file); } int main(void){ char choice; char filename[20]; FILE *file; printf("please input filename:"); scanf("%s", filename); un_user_char(); file = fopen(filename, "w"); if (file == NULL){ printf("open file error!\n"); } while (1){ printf("please input if you want to add string(y/n):"); scanf("%c", &choice); un_user_char(); if (‘y‘ == choice){ put_str(file); un_user_char(); } else if (‘n‘ == choice){ break; } else { printf("please input a qualified cammond!\n"); } } fclose(file); file = NULL; return 0; }
-实现一个复制的小功能
原文:https://www.cnblogs.com/laijianwei/p/14585532.html