C语言编程题删除文本文件中的所有空行

C 语言中,删除文本文件中的所有空行有多种方法。可以使用使用临时文件,也可以直接修改文件内容,还可以使用文件映射等方法,每个方法各有优缺点,选择合适的方法可以根据具体的需求和限制条件来决定。

1、使用临时文件

打开原始文件和一个临时文件,读取原始文件的每一行,然后检查是否为空行,将非空行写入临时文件,最后关闭两个文件,在删除原始文件,将临时文件重命名为原始文件名。

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

#define MAX_LINE_LENGTH 256

void remove_empty_lines(const char *filename) {
    FILE *src = fopen(filename, "r");
    if (!src) {
        perror("Failed to open source file");
        return;
    }
    
    FILE *temp = fopen("temp.txt", "w");
    if (!temp) {
        perror("Failed to open temporary file");
        fclose(src);
        return;
    }
    
    char line[MAX_LINE_LENGTH];
    while (fgets(line, sizeof(line), src)) {
        if (strcmp(line, "\n") != 0) {
            fputs(line, temp);
        }
    }
    
    fclose(src);
    fclose(temp);
    
    remove(filename);
    rename("temp.txt", filename);
}

int main() {
    remove_empty_lines("file.txt");
    return 0;
}

2、直接修改文件内容

读取文件内容到内存中,在内存中处理内容,删除空行,最后写回处理后的内容到原文件。注意修改文件的大小,不要超过内存的限制。

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

#define MAX_FILE_SIZE 1048576 // 1 MB

void remove_empty_lines(const char *filename) {
    FILE *file = fopen(filename, "r+");
    if (!file) {
        perror("Failed to open file");
        return;
    }
    
    char *buffer = malloc(MAX_FILE_SIZE);
    if (!buffer) {
        perror("Failed to allocate memory");
        fclose(file);
        return;
    }
    
    size_t len = fread(buffer, 1, MAX_FILE_SIZE - 1, file);
    buffer[len] = '\0';
    
    fseek(file, 0, SEEK_SET);
    ftruncate(fileno(file), 0);
    
    char *line = strtok(buffer, "\n");
    while (line) {
        if (strlen(line) > 0) {
            fprintf(file, "%s\n", line);
        }
        line = strtok(NULL, "\n");
    }
    
    fclose(file);
    free(buffer);
}

int main() {
    remove_empty_lines("file.txt");
    return 0;
}

3、使用文件映射(mmap)

使用 mmap 将文件映射到内存中,在内存中处理内容,删除空行,最后将修改后的内容写回文件。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <unistd.h>

void remove_empty_lines(const char *filename) {
    int fd = open(filename, O_RDWR);
    if (fd == -1) {
        perror("Failed to open file");
        return;
    }
    
    off_t size = lseek(fd, 0, SEEK_END);
    char *data = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
    if (data == MAP_FAILED) {
        perror("Failed to map file");
        close(fd);
        return;
    }
    
    char *end = data + size;
    char *p = data;
    while (p < end) {
        char *line_end = strchr(p, '\n');
        if (!line_end) line_end = end;
        
        if (line_end != p && (line_end == p + 1 || *(line_end - 1) != '\n')) {
            memmove(data, p, line_end - p);
            data += (line_end - p);
            *data++ = '\n';
        }
        
        p = line_end + 1;
    }
    
    ftruncate(fd, data - data);
    munmap(data, size);
    close(fd);
}

int main() {
    remove_empty_lines("file.txt");
    return 0;
}

推荐阅读
cjavapy编程之路首页