MST

星途 面试题库

面试题:C语言系统调用封装:文件操作封装

请用C语言封装对文件的打开、读取、写入和关闭操作的系统调用。要求封装成函数,并且在函数中处理可能出现的错误,例如文件打开失败等。
30.4万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// 打开文件
FILE* openFile(const char* filename, const char* mode) {
    FILE* file = fopen(filename, mode);
    if (file == NULL) {
        perror("Failed to open file");
        return NULL;
    }
    return file;
}

// 读取文件内容
char* readFile(FILE* file, size_t* size) {
    if (file == NULL) {
        perror("File is not opened");
        return NULL;
    }

    fseek(file, 0, SEEK_END);
    *size = ftell(file);
    fseek(file, 0, SEEK_SET);

    char* buffer = (char*)malloc(*size + 1);
    if (buffer == NULL) {
        perror("Failed to allocate memory");
        return NULL;
    }

    size_t readBytes = fread(buffer, 1, *size, file);
    if (readBytes != *size) {
        perror("Failed to read file");
        free(buffer);
        return NULL;
    }

    buffer[*size] = '\0';
    return buffer;
}

// 写入文件内容
int writeFile(FILE* file, const char* content) {
    if (file == NULL) {
        perror("File is not opened");
        return -1;
    }

    size_t writeBytes = fwrite(content, 1, strlen(content), file);
    if (writeBytes != strlen(content)) {
        perror("Failed to write to file");
        return -1;
    }
    return 0;
}

// 关闭文件
void closeFile(FILE* file) {
    if (file != NULL) {
        if (fclose(file) != 0) {
            perror("Failed to close file");
        }
    }
}

你可以这样调用这些函数:

int main() {
    const char* filename = "test.txt";
    FILE* file = openFile(filename, "w+");
    if (file != NULL) {
        const char* writeContent = "Hello, World!";
        if (writeFile(file, writeContent) == 0) {
            printf("Write to file successfully.\n");
            rewind(file); // 将文件指针移动到文件开头以便读取
            size_t size;
            char* readContent = readFile(file, &size);
            if (readContent != NULL) {
                printf("Read from file: %s\n", readContent);
                free(readContent);
            }
        }
        closeFile(file);
    }
    return 0;
}