C语言中的文件处理

文件

文件是当今计算机系统不可或缺的部分。文件用于存储程序,文档,数据,书信,表格,图形,照片,等其它种类的信息

文件通常是指在磁盘或固态是的一段已经命名的缓冲区,例如我们经常使用的stdio.h就是一个文件,c语言将文件看成一段连续的字节,每个字节都可被单独读输,c提供了两种模式:文本模式和二进制模式

文件输入输出

用<和>做重定向

FILE

FILE* fopen(const char* restrict path,const char* restrict mode); //其中path指向一个字符串,该字符串为该文件的文件名(即路径),第二个参数为c语言规定的模式字符串
int fclose(FILE* stream);
fscanf(FILE*,...);
fprintf(FILE*,...);

打开文件的标准代码
FILE* fp = fopen("file", "r");
if(fp){
    fscanf(fp, ...);
    fclose(fp);
}else{
    ...
}

fopen

mode含义
r打开只读
r+打开可读可写,从文件头开始
w打开只写,如果文件不存在则创建,如果存在则覆盖
w+打开可读可写,如果文件不存在则创建,如果存在则覆盖
a打开只写,如果文件不存在则创建,如果存在则追加
a+打开可读可写,如果文件不存在则创建,如果存在则追加,读取从文件的开头开始

如果打开文件失败,这里fopen()函数会返回一个空指针

关闭文件

我们在对文件进行完操作之后,一定要关闭文件,否则会造成内存泄漏,这时就要用到fclose()函数关闭文件
fclose(FILE* stream);
所以对于比较正式的程序我们应该检查文件是否关闭,当文件成功关闭时fclose函数返回0,否则返回EOF

if(fclose(fp) != 0){
    printf("Error in closing file %s\n", file_name);
}

文件的读写操作

输入输出字符

在c语言中我们利用fgetc()和fputc()函数进行文件里字符的输入和输出

ch = getc(fp);
putc(ch, fp);

getc()函数从fp指向的文件中读取一个字符赋给ch,如果读取成功则返回字符本身,否则返回EOF
putc()函数将ch中的字符写入fp指向的文件中

输入输出字符串

使用fgets()和fputs()函数

fgets(str, n, fp);

fgets函数的第一个参数和gets函数相同表示存储输入的地址(如上述代码中的buf是一个char型数组的名称),第二个参数是一个整数,表示带输入字符串的大小,最后一个参数为文件指针
fgets函数读取输入直到第一个换行符的后面,或者读到文件的末尾——EOF,或者读取到stlen-1个字符,然后fgets函数在末尾添加一个空字符使之成为一个字符串,故我们读取的字符串长度为字符数加上一个空字符
注意,如果fgets函数在读到字符上限之前已经读完一行,它为将换行符放到空字符前面。fgets在遇见eof即文件结尾时会返回null

fputs(str, fp);

fputs函数的两个参数实际意义与fgets相同,它的作用是将字符串写入指定的文件中,其中由于fgets函数会保留换行符,所以fputs函数不会像puts函数一样自动添加换行符。

数据块的写入(fwrite)

fwrite(const void *ptr, size_t size, size_t count, FILE *stream);
参数1:要获取的数据的地址
参数2:要写入内容的单字节数
参数3:要写入size字节的数据项的个数
参数4:目标文件指针
返回值:返回实际写入的数据块的数目,如果发生错误,则可能小于count
作用:向文件写入数据块,以二进制形式对文件进行操作,不局限于文本文件。

数据块的读取(fread)

fread(void *ptr, size_t size, size_t count, FILE *stream);
参数1:存储读取的数据
参数2:要读取的每个数据项的字节数
参数3:要读取的数据项的个数
参数4:读取的文件流
返回值:返回真实读取的数据项count数,若出现错误或文件尾条件,则可能小于count
作用:一次读取文件中由若干个数据项组成的数据块,数据块的大小取决于数据项的大小和数据项的个数

文件格式化的输入输出

文件的格式化输入与输出函数为fscanf,fprintf函数,它们与scanf和printf函数类似,只是fscanf和fprintf的第一个参数为文件指针,而scanf和printf的第一个参数为格式字符串

文件读写移动操作

ftell()函数

用来读取文件当前位置
一般形式为:long int ftell(FILE *stream);
他的返回值是一个长整形,表示当前的读写位置(从文件开始处到现在的字节数),调用正确返回当前的读写位置,否则返回-1

fseek()函数

fseek函数用来设置文件读写位置
一般形式为:int fseek(FILE *stream, long int offset, int whence);
offset:表示偏移量,即从whence处开始移动offset个字节
whence:表示移动的起点,有3个值可选:SEEK_SET(文件开头)、SEEK_CUR(当前位置)、SEEK_END(文件结尾)
如果成功则返回0,否则返回非0值

文件操作判断ferror()函数

用来判断文件操作是否出错
int ferror(FILE *stream);
返回值0,表示没有错误发生;返回非0值,表示有错误发生
注意;在调用一个输入输出函数后立即检查ferror()函数,否则信息会丢失,在执行fopen函数时,ferror函数的初始值自动置为0

使文件位置重新置于开头的rewind()函数

void rewind(FILE *stream);

文件的应用

这里我们倒序打印hello world

#include <stdio.h>
#include <stdlib.h>
#define SLEN 81

int main(){
    char file[SLEN];
    char ch;
    FILE* fp;
    long count, last;
    puts("Enter file name: ");
    scanf("%80s",file);
    if((fp = fopen(file, "r")) == NULL){
        printf("Can not open file %s\n", file);
        exit(1);
    }
    fseek(fp, 0L, SEEK_END);
    last = ftell(fp);
    for(count = 1;count <= last; count++){
        fseek(fp, -count, SEEK_END);
        ch = getc(fp);
        if(ch != 'EOF' && ch != 'r'){
            putchar(ch);
        }
    }
    printf("\n");
    fclose(fp);
    return 0;
}
  • 29
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值