C语言文件操作

文件操作详解

C语言提供了丰富的文件操作功能,用于读写文件。

文件操作的主要特点:

  • 文件的打开和关闭
  • 文件的读写操作
  • 文件定位
  • 二进制文件操作
  • 错误处理
  • 文件缓冲
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// 函数声明
void writeToFile(const char *filename);
void readFromFile(const char *filename);
void appendToFile(const char *filename);
void copyFile(const char *source, const char *destination);
void filePositioning(const char *filename);
void binaryFileOperations(const char *filename);
void fileErrorHandling(const char *filename);
void fileBuffering(const char *filename);

int main() {
    const char *filename = "example.txt";
    const char *binaryFile = "data.bin";
    const char *copyFile = "copy.txt";
    
    // 写入文件
    printf("写入文件示例:\n");
    writeToFile(filename);
    
    // 读取文件
    printf("\n读取文件示例:\n");
    readFromFile(filename);
    
    // 追加文件
    printf("\n追加文件示例:\n");
    appendToFile(filename);
    readFromFile(filename);
    
    // 复制文件
    printf("\n复制文件示例:\n");
    copyFile(filename, copyFile);
    printf("复制后的文件内容:\n");
    readFromFile(copyFile);
    
    // 文件定位
    printf("\n文件定位示例:\n");
    filePositioning(filename);
    
    // 二进制文件操作
    printf("\n二进制文件操作示例:\n");
    binaryFileOperations(binaryFile);
    
    // 文件错误处理
    printf("\n文件错误处理示例:\n");
    fileErrorHandling("nonexistent.txt");
    
    // 文件缓冲
    printf("\n文件缓冲示例:\n");
    fileBuffering(filename);
    
    return 0;
}

// 写入文件
void writeToFile(const char *filename) {
    FILE *file = fopen(filename, "w");
    if (file == NULL) {
        printf("无法打开文件:%s\n", filename);
        return;
    }
    
    fprintf(file, "这是第一行\n");
    fprintf(file, "这是第二行\n");
    fprintf(file, "这是第三行\n");
    
    fclose(file);
    printf("文件写入成功\n");
}

// 读取文件
void readFromFile(const char *filename) {
    FILE *file = fopen(filename, "r");
    if (file == NULL) {
        printf("无法打开文件:%s\n", filename);
        return;
    }
    
    char line[256];
    while (fgets(line, sizeof(line), file) != NULL) {
        printf("%s", line);
    }
    
    fclose(file);
}

// 追加文件
void appendToFile(const char *filename) {
    FILE *file = fopen(filename, "a");
    if (file == NULL) {
        printf("无法打开文件:%s\n", filename);
        return;
    }
    
    fprintf(file, "这是追加的内容\n");
    
    fclose(file);
    printf("文件追加成功\n");
}

// 复制文件
void copyFile(const char *source, const char *destination) {
    FILE *src = fopen(source, "r");
    if (src == NULL) {
        printf("无法打开源文件:%s\n", source);
        return;
    }
    
    FILE *dst = fopen(destination, "w");
    if (dst == NULL) {
        printf("无法创建目标文件:%s\n", destination);
        fclose(src);
        return;
    }
    
    char buffer[1024];
    size_t bytes;
    while ((bytes = fread(buffer, 1, sizeof(buffer), src)) > 0) {
        fwrite(buffer, 1, bytes, dst);
    }
    
    fclose(src);
    fclose(dst);
    printf("文件复制成功\n");
}

// 文件定位
void filePositioning(const char *filename) {
    FILE *file = fopen(filename, "r");
    if (file == NULL) {
        printf("无法打开文件:%s\n", filename);
        return;
    }
    
    // 获取文件大小
    fseek(file, 0, SEEK_END);
    long size = ftell(file);
    printf("文件大小:%ld 字节\n", size);
    
    // 回到文件开始
    fseek(file, 0, SEEK_SET);
    
    // 读取第一行
    char line[256];
    if (fgets(line, sizeof(line), file) != NULL) {
        printf("第一行:%s", line);
    }
    
    // 移动到文件中间
    fseek(file, size / 2, SEEK_SET);
    if (fgets(line, sizeof(line), file) != NULL) {
        printf("中间行:%s", line);
    }
    
    fclose(file);
}

// 二进制文件操作
void binaryFileOperations(const char *filename) {
    // 写入二进制数据
    FILE *file = fopen(filename, "wb");
    if (file == NULL) {
        printf("无法创建二进制文件:%s\n", filename);
        return;
    }
    
    int numbers[] = {1, 2, 3, 4, 5};
    fwrite(numbers, sizeof(int), 5, file);
    fclose(file);
    
    // 读取二进制数据
    file = fopen(filename, "rb");
    if (file == NULL) {
        printf("无法打开二进制文件:%s\n", filename);
        return;
    }
    
    int readNumbers[5];
    fread(readNumbers, sizeof(int), 5, file);
    
    printf("读取的二进制数据:");
    for (int i = 0; i < 5; i++) {
        printf("%d ", readNumbers[i]);
    }
    printf("\n");
    
    fclose(file);
}

// 文件错误处理
void fileErrorHandling(const char *filename) {
    FILE *file = fopen(filename, "r");
    if (file == NULL) {
        perror("文件打开错误");
        return;
    }
    
    // 检查文件是否为空
    fseek(file, 0, SEEK_END);
    if (ftell(file) == 0) {
        printf("文件为空\n");
    }
    
    // 检查文件权限
    if (fclose(file) == EOF) {
        perror("文件关闭错误");
    }
}

// 文件缓冲
void fileBuffering(const char *filename) {
    FILE *file = fopen(filename, "w");
    if (file == NULL) {
        printf("无法打开文件:%s\n", filename);
        return;
    }
    
    // 设置行缓冲
    setvbuf(file, NULL, _IOLBF, 0);
    
    fprintf(file, "这是行缓冲的内容\n");
    fprintf(file, "这是另一行内容\n");
    
    // 强制刷新缓冲区
    fflush(file);
    
    fclose(file);
    printf("文件缓冲操作完成\n");
}