C语言读取文件详解(文本文件读取)

一、文件读取方式

C语言读取文件有两种方式:二进制读取和文本读取。二进制读取方式可以读取图像、音频等二进制文件,文本读取方式则适用于读取文本文件。

使用二进制读取方式,需要以“二进制”模式打开文件,使用文本读取方式,则需要以“文本”模式打开文件,否则C语言会将文本文件中的回车符号转换成换行符,导致文件读取失败。

//二进制读取方式示例代码
FILE *fp = fopen("example.bin", "rb");
if(fp == NULL){
    printf("无法打开文件!");
}else{
    char buffer[1024];
    int len = sizeof(buffer);
    while(fread(buffer, 1, len, fp) > 0){
        //文件读取逻辑
    }
    fclose(fp);
}

//文本读取方式示例代码
FILE *fp = fopen("example.txt", "r");
if(fp == NULL){
    printf("无法打开文件!");
}else{
    char buffer[1024];
    while(fgets(buffer, 1024, fp)){
        //文件读取逻辑
    }
    fclose(fp);
}

二、文件读取方法

C语言有多种文件读取方法,常用的有getc()、fgetc()、fread()、fgets()、fscanf()等。

getc()和fgetc()方法用于读取单个字符,fread()用于读取二进制文件或文本文件中的指定字节数,fgets()用于读取单行文本,fscanf()用于读取指定格式的文本。

//getc()示例代码
FILE *fp = fopen("example.txt", "r");
if(fp == NULL){
    printf("无法打开文件!");
}else{
    char ch;
    while((ch = getc(fp)) != EOF){
        //文件读取逻辑
    }
    fclose(fp);
}

//fread()示例代码
FILE *fp = fopen("example.bin", "rb");
if(fp == NULL){
    printf("无法打开文件!");
}else{
    char buffer[1024];
    int len = sizeof(buffer);
    while(fread(buffer, 1, len, fp) > 0){
        //文件读取逻辑
    }
    fclose(fp);
}

三、文件指针及偏移量

在C语言中,文件操作需要使用文件指针(FILE*)进行,文件指针记录了当前读取的位置。文件指针的初始位置为文件开头。

C语言还提供了fseek()和ftell()方法,用于文件偏移量的控制。fseek()可以定位文件指针到指定位置,ftell()返回当前文件指针的偏移量。使用这两种方法可以实现文件的随机读取,特别是在读取超过1GB的大文件时,可以大大节省内存和时间。

//文件偏移量控制示例代码
long offset;
fseek(fp, 0, SEEK_END); //将文件指针定位到文件结尾
offset = ftell(fp);
fseek(fp, offset / 2, SEEK_SET); //将文件指针定位到文件中间位置

四、文件读取性能优化

为了提高文件读取性能,我们可以使用缓存机制,将文件内容一次性读入内存中,然后在内存中进行数据处理。这种方式会大大减少文件读取次数,提高程序的效率。

C语言的标准库函数提供了fread()方法,可以读取一定字节数的数据,我们可以利用这个方法将文件内容读取到内存中,然后进行数据处理。

//文件读取性能优化示例代码
FILE *fp = fopen("example.bin", "rb");
if(fp == NULL){
    printf("无法打开文件!");
}else{
    char buffer[1024*1024]; //1MB缓冲区
    int len = sizeof(buffer);
    int readBytes;
    while((readBytes = fread(buffer, 1, len, fp)) > 0){
        //将读取到的数据存放到内存中
    }
    fclose(fp);
}

五、文件读取异常处理

在文件读取过程中,可能会出现一些异常情况,如打开文件失败、文件不存在等等。为了避免这些异常情况对程序造成影响,我们需要进行异常处理。

常见的文件读取异常包括文件不存在、文件格式不正确、打开文件异常等。我们可以使用errno来获得异常信息,或使用try…catch语句进行异常捕获和处理。

//文件读取异常处理示例代码
FILE *fp = fopen("example.bin", "rb");
if(fp == NULL){
    if(errno == ENOENT){
        printf("文件不存在!");
    }else if(errno == EACCES){
        printf("无法访问文件!");
    }else{
        printf("打开文件异常!");
    }
}else{
    //正常读取文件
    fclose(fp);
}

六、完整代码示例

#include 
#include 

int main(){
    FILE *fp = fopen("example.txt", "r");
    if(fp == NULL){
        if(errno == ENOENT){
            printf("文件不存在!");
        }else if(errno == EACCES){
            printf("无法访问文件!");
        }else{
            printf("打开文件异常!");
        }
    }else{
        char buffer[1024];
        while(fgets(buffer, 1024, fp)){
            printf("%s", buffer); //将读取到的数据输出到控制台
        }
        fclose(fp);
    }

    return 0;
}

Published by

风君子

独自遨游何稽首 揭天掀地慰生平