c c file - yaokun123/php-wiki GitHub Wiki

文件操作

一、文件概述

磁盘文件:指一组相关数据的有序集合,通常存储在外部介质(如磁盘)上,使用时才调入内存。

设备文件:在操作系统中把每一个与主机相连的输入、输出设备看作是一个文件,把他们的输入、输出等同于对磁盘文件的读和写。

计算机的存储在物理上的是二进制的,所以物理上所有的磁盘文件本质上都是一样的。以字节为单位进行顺序存储。

从用户或者操作系统使用的角度(逻辑上)把文件分为:

文本文件:基于字符编码的文件

基于字符编码,常见编码有ASCII、UNICODE等
一般可以使用文本编辑器直接打开
数5678的以ASCII存储形式(ASCII码)为:00110101 00110110 00110111 00111000

存储时,是将字符的ascii值存在磁盘中。
取出时,是将ascii值翻译为对应的字符。

二进制文件:基于值编码的文件

基于值编码,自己根据具体应用,指定某个值是什么意思
把内存中的数据按其在内存中的存储形式原样输出到磁盘
数5678的存储形式(二进制码)为:00010110 00101110

存的是二进制,取的是二进制

二、文件操作

1、打开文件:FILE *fp = fopen("pathname","mode")

#include<stdio.h>

int main(){
    FILE *fp = fopen("./test.txt","r");//打开一个文件,成功返回FILE结构体地址,失败返回NULL
    if(fp == NULL){
        printf("fopen fail\n");
        perror("[]");//打印错误日志
        return 0;
    }
    printf("fopen success\n");

    return 0;
}

2、关闭文件:fclose(*fp)

3、写文件:

写入一个字符到文件中:成功返回写入的字符,失败返回-1
fputc(int ch,FILE * stream)


将str所指定的字符串写入到stream指定的文件中,字符串结束符'\0'不写入文件:成功0,失败-1
int fputs(const char * str,FILE * stream)


根据参数format字符串来转换并格式化数据,然后将结果输出到stream指定的文件中,出现字符串结束符'\0'为止
int fprintf(FILE * stream,const char format,...)


以数据块的方式给文件写内容,成功返回写入文件数据的块数目,次值和nmemb相等
size_t fwrite(const void *ptr,size_t size,size_t nmemb,FILE * stream);

4、读文件:

从文件中读取一个字符:成功返回读取到的字符,失败返回-1
fgetc(FILE *stream)


读取字符串:成功返回字符串,失败NULL
char * fgets(char *str,int size,FILE * stream);


从stream指定的文件读取字符串,并根据参数format字符串来转换并格式化数据,成功返回转换个数,失败-1
int fscanf(FILE * stream, const char * format,...)


以数据块的方式从文件中读取内容,成功返回读取到内容的块数,如果此值比nmemb小,但大于0,说明读到了文件的结尾,失败0
size_t fread(void *ptr,size_t size,size_t nmemb,FILE *stream);

注意:如果读取文件不是存文本,有像-1这种数字,那么就不可以使用EOF(-1)作为文件的结尾。可以使用feof(FILE * stream)

5、文件的随机读写

移动文件流(文件光标)的读写位置
int fseek(FILE *stream,long offset,int whence);


把文件流(文件光标)的读写位置移动到文件开头
void rewind(FILE * stream);


获取文件流(文件光标)的读写位置
long ftell(FILE * stream);

6、获取文件状态信息

获取文件状态信息
int stat(const char *path,struct stat * buf)

删除文件、重命名文件

删除文件:
int remove(const char * pathname);


重命名文件:
int rename(const char *oldpath,const char *newpath)

三、文件缓冲区

缓冲区:就是内存中一块临时的空间

fflush:强制刷新缓冲区

windows:标准输出stdout文件没有缓冲区

linux:标准输出stdout文件有缓冲区,遇到‘\n’才会刷新

⚠️ **GitHub.com Fallback** ⚠️