文件操作总结

文件可分为文本文件和二进制文件
od -tx1 -tc -Ax 文件名 读二进制文件
文本文件特点:存储量大,转换为二进制速度慢,直观易记
二进制文件特点:存储量小,无需转换。但因一个字节不对应一个字符,故不能直接输出其字符形式

打开文件fopen FILE *fopen(const char *path, const char *mode);
FILE *这样的指针称为不透明指针(Opaque Pointer)或者叫句柄(Handle)。
path 参数可以是相对路径(…/fishc.txt)也可以是绝对路径(/home/FishC/fishc.txt),如果只给出文件名而不包含路径,则表示该文件在当前文件夹中。
mode表示打开方式。
r:只读,文件必须存在
r+:允许读和写,文件必须存在
w:只写,文件不存在则自动创建,从头开始写,即会替换掉原来的文件内容
w+:允许读和写,文件不存在则自动创建,从头开始写,即会替换掉原来的文件内容
a:只能在文件末尾追加数据,文件不存在则自动创建
a+:允许读和追加数据,如果文件不存在则自动创建
fopen的使用

  1. 如果文件打开成功,则返回一个指向 FILE 结构的文件指针;
  2. 如果文件打开失败,则返回 NULL 并设置 errno 为指定的错误。
    通常写法:
    FILE *fp;
    if ((fp = fopen(“/tmp/file1”, “r”)) == NULL)
    {
    perror(“error open file /tmp/file 1”);
    exit(1);
    }

fclose
关闭文件,一个文件操作完毕一定要将其关闭!!!

以字节为单位的I/O函数

fgetc和getchar(getchar要等用户输入回车或者达到末尾才返回)
fgetc 函数用于从文件流中读取下一个字符并推进文件的位置指示器(用来指示接下来要读写的下一个字符的位置)。
int fgetc(FILE *stream) 返回值:成功返回读到的字节,出错或者读到文件末尾时返回EOF
fgetc读一个文件,该文件的打开方式必须时可读的。

fputc和putchar
fputc 函数用于将一个字符写入到指定的文件中并推进文件的位置指示器(用来指示接下来要读写的下一个字符的位置)。
int fputc(int c, FILE *stream); 返回值:成功返回写入的字节,出错返回EOF
fputc写一个文件,该文件的打开方式必须时可写的(包括追加)。
每调用一次fputc,读写位置向后移动一个字节,因此可以连续多次调用fputc函数依次写入多个字节。但如果文件是以追加方式打开的,每次调用fpuc时总是将读写位置移到文件末尾然后把要写入的字节追加到后面。

fseek
int (FILE *stream, long offset, int whence);
返回值:成功返回当前读写位置,出错返回-1并设置errno
fseek的whence和offset参数共同决定了读写位置移动到何处
whence参数的含义如下:
SEEK_SET从文件开头移动offset个字节
SEEK_CUR从当前位置移动offset个字节
SEEK_END从文件末尾移动offset个字节

以字符串为单位的I/O函数

fgets和gets 写程序不要用gets!!!!
fgets从指定的文件中读一行到调用者提供的缓冲区中(从指定文件中读取字符串)
gets从标准输入读一行字符到调用者提供的缓冲区中
char *fgets(char *s, int size, FILE *stream);
返回值:成功时s指向哪返回的指针就指针就指向哪,出错或者读到文件末尾时返回NULL

对于fgets来说,‘\n’是一个特别的字符,而’\0’并无任何特别之处,如果读到’\0’就当作普通字符读入。
如果文件中存在’\0’字符,调用fgets之后就无法判断缓冲区中的’\0’究竟时从文件读来的字符,还是由fgets自动添加的结束符,所以fgets只适合读文本文件而不适合读二进制文件,并且文本文件中的所有字符都应该是可见字符,不能有’\0’。

fputs和puts
fputs 函数用于将一个字符串写入到指定的文件中,表示字符串结尾的 ‘\0’ 不会被一并写入。
int fputs(const char *s, FILE *stram);
返回值:成功返回一个非负数,出错返回EOF

以记录为单位的I/O函数

fread 函数用于从指定的文件中读取指定尺寸的数据。
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
参数分别代表读的对象 每块的大小 读几块 源文件

fwrite 函数用于将指定尺寸的数据写入到指定的文件中。
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
参数分别代表写的对象 每块的大小 写几块 源文件
返回值:读或写的记录数,成功时返回的记录数nmemb,出错或读到文件末尾时返回的记录数小于nmemb,也可能返回0

格式化I/O函数

fprintf、sprintf和snprintf
返回值:成功返回格式化输出的字节数(不包括字符串的结尾’\0’),出错返回一个负值。
fprintf 函数用于打印格式化字符串到指定的文件(具有写的权限)。
int fprintf(FILE *stream, const char *format, …);
在这里插入图片描述
与 printf 函数类似,不过 sprintf 函数是将格式化数据写入到字符串中。
缓冲区的尺寸必须足够大,以至于可以包含整个转换后的结果。(snprintf 函数是更安全的版本)
int sprintf(char *str, const char *format, …);

snprintf 函数是 sprintf 函数的安全版本,因为它在调用的时候需要指定缓冲区的最大尺寸,这样可以有效避免缓冲区溢出。
如果写入的字符串尺寸大于 size - 1,那么后边的字符将被丢弃,但依旧会统计进长度中(返回值)。
int snprintf(char *str, size_t size, const char *format, …);
在这里插入图片描述

fcanf
fscanf 函数用于从指定文件中读取格式化字符串。
int fscanf(FILE *stream, const char *format, …);
返回值
如果函数调用成功,返回值是成功获取并填充到附加参数中的个数。
如果函数调用失败,返回值小于附加参数的个数(甚至是 0)。
如果读取到标准输入流的结尾处,则返回 EOF。
在这里插入图片描述

fflush
fflush 函数用于将缓冲区内的数据强制写入指定的文件中。
int fflush(FILE *stream);
返回值:如果函数调用成功,返回值是 0。如果函数调用失败,返回 EOF 并设置 errno 为指定的错误。
fflush函数用于确保数据写回了内核,以免进程异常终止时丢失数据。

  • 27
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值