C语言 File文件处理 读文件

C语言中,文件处理是通过标准库函数来实现的。文件处理主要包括文件的打开、读取、写入、关闭等操作。文件处理函数主要位于<stdio.h>头文件中。读取文件是常见的操作。通过打开一个文件,我们可以逐个字符、逐行或按块读取文件中的数据。本文主要介绍C语言 File文件操作读文件。

1、读文件

要使用C语言读取文件,可以使用size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream),此方法返回成功读取的元素总数会以 size_t 对象返回,size_t 对象是一个整型数据类型。如果总数与 nmemb 参数不同,则可能发生了一个错误或者到达了文件末尾。

例如,

#include<stdio.h>
#define nmemb 3
struct test
{
  char name[20];
  int size;
} s[nmemb];
int main(){
  FILE * stream;
  int i;
  stream = fopen("/tmp/fwrite","r");
  fread(s,sizeof(struct test),nmemb,stream);
  fclose(stream);
  for(i=0;i<nmemb;i++)
    printf("name[%d]=%-20s:size[%d]=%d\n",i,s[i].name,i,s[i].size);
}

文件读取还有其它函数,可以参考下面的文档,

相关函数C语言File文件处理相关函数

2、获取文件信息

要获取有关文件的更多信息,可以使用int fstat(int fildes, struct stat *buf);函数。

stat文件信息结构体:

struct stat {  
    dev_t         st_dev;      /* device */  
    ino_t         st_ino;      /* inode */  
    mode_t        st_mode;     /* protection */  
    nlink_t       st_nlink;    /* number of hard links */  
    uid_t         st_uid;      /* user ID of owner */  
    gid_t         st_gid;      /* group ID of owner */  
    dev_t         st_rdev;     /* device type (if inode device) */  
    off_t         st_size;     /* total size, in bytes */  
    blksize_t     st_blksize;  /* blocksize for filesystem I/O */  
    blkcnt_t      st_blocks;   /* number of blocks allocated */  
    time_t        st_atime;    /* time of last access */  
    time_t        st_mtime;    /* time of last modification */  
    time_t        st_ctime;    /* time of last change */  
}; 

例如,

#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>

#include <sys/types.h>
#include <sys/stat.h>

int main ( int argc, char *argv[])
{
    struct stat FileAttrib;


    if (stat("/etc/passwd", &FileAttrib) < 0)
        printf("File Error Message = %s\n", strerror(errno));
    else
        printf( "Permissions: %d\n", FileAttrib.st_mode );

    return 0;
}

3、使用 fscanf() 逐行读取文本

fscanf()读取文件的每一行,并将其存储在 line 中。%99[^\n] 表示读取不超过 99 个字符,且读取到换行符停止。使用 perror() 打印系统错误信息,如果文件无法打开。

#include <stdio.h>

int main() {
    // 打开文件以读取模式 ("r")
    FILE *file = fopen("example.txt", "r");

    // 检查文件是否成功打开
    if (file == NULL) {
        perror("Error opening file");
        return 1;
    }

    // 定义一个缓冲区存储每一行的内容
    char buffer[100];

    // 使用 fgets 逐行读取文件内容
    while (fgets(buffer, sizeof(buffer), file) != NULL) {
        printf("%s", buffer);  // fgets 会读取换行符,无需手动添加
    }

    // 关闭文件
    fclose(file);

    return 0;
}

4、使用 fgets() 读取文本文件

fgets()每次读取一行内容(包括换行符),适合读取较长的文本。buffer存储读取的行,sizeof(buffer) 确保不会读取超过缓冲区的大小。

#include <stdio.h>

int main() {
    // 打开文件以读取模式 ("r")
    FILE *file = fopen("example.txt", "r");

    // 检查文件是否成功打开
    if (file == NULL) {
        perror("Error opening file");
        return 1;
    }

    // 定义一个缓冲区存储每一行的内容
    char buffer[100];

    // 使用 fgets 逐行读取文件内容
    while (fgets(buffer, sizeof(buffer), file) != NULL) {
        printf("%s", buffer);  // fgets 会读取换行符,无需手动添加
    }

    // 关闭文件
    fclose(file);

    return 0;
}

5、使用 fread() 读取二进制文件

fread() 从二进制文件中读取数据块。参数buffer存储读取内容的数组,sizeof(int)每个元素的大小。file 文件指针。

#include <stdio.h>

int main() {
    // 打开文件用于二进制读取 ("rb")
    FILE *file = fopen("data.bin", "rb");

    // 检查文件是否成功打开
    if (file == NULL) {
        perror("Error opening file");
        return 1;
    }

    // 定义一个缓冲区用于存储读取的数据
    int buffer[5];

    // 使用 fread 读取文件内容
    size_t bytesRead = fread(buffer, sizeof(int), 5, file);

    // 输出读取的内容
    printf("Bytes read: %lu\n", bytesRead);
    for (size_t i = 0; i < bytesRead; i++) {
        printf("buffer[%lu] = %d\n", i, buffer[i]);
    }

    // 关闭文件
    fclose(file);

    return 0;
}

6、检查文件是否结束(EOF)

fgetc() 逐字符读取文件内容。EOF(End of File)表示文件结束,fgetc() 返回 EOF 时停止读取。

#include <stdio.h>

int main() {
    // 打开文件以读取模式 ("r")
    FILE *file = fopen("example.txt", "r");

    if (file == NULL) {
        perror("Error opening file");
        return 1;
    }

    char c;

    // 使用 fgetc 逐字符读取文件内容
    while ((c = fgetc(file)) != EOF) {
        putchar(c);  // 输出字符
    }

    fclose(file);
    return 0;
}

推荐阅读
cjavapy编程之路首页