C语言如何高效获取文件行数?

99ANYc3cd6
预计阅读时长 10 分钟
位置: 首页 C语言 正文

在C语言中获取文件的行数

在C语言中,获取文件的行数可以通过逐行读取文件并计数来实现,以下是几种常见的方法:

方法1:使用fgetc逐个字符读取

#include <stdio.h>
int count_lines(const char *filename) {
    FILE *file = fopen(filename, "r");
    if (file == NULL) {
        perror("无法打开文件");
        return -1;
    }
    int lines = 0;
    int c;
    while ((c = fgetc(file)) != EOF) {
        if (c == '\n') {
            lines++;
        }
    }
    // 处理文件不以换行符结尾的情况
    if (c != EOF && lines == 0) {
        lines = 1;
    } else if (c != EOF) {
        lines++;
    }
    fclose(file);
    return lines;
}
int main() {
    const char *filename = "example.txt";
    int line_count = count_lines(filename);
    if (line_count != -1) {
        printf("文件 %s 有 %d 行\n", filename, line_count);
    }
    return 0;
}

方法2:使用fgets逐行读取

#include <stdio.h>
int count_lines(const char *filename) {
    FILE *file = fopen(filename, "r");
    if (file == NULL) {
        perror("无法打开文件");
        return -1;
    }
    int lines = 0;
    char buffer[1024];
    while (fgets(buffer, sizeof(buffer), file) != NULL) {
        lines++;
    }
    fclose(file);
    return lines;
}
int main() {
    const char *filename = "example.txt";
    int line_count = count_lines(filename);
    if (line_count != -1) {
        printf("文件 %s 有 %d 行\n", filename, line_count);
    }
    return 0;
}

方法3:使用fseek和ftell(不推荐,可能不准确)

这种方法计算的是换行符的数量,但对于某些特殊情况(如文件末尾没有换行符)可能不准确:

#include <stdio.h>
int count_lines(const char *filename) {
    FILE *file = fopen(filename, "r");
    if (file == NULL) {
        perror("无法打开文件");
        return -1;
    }
    fseek(file, 0, SEEK_END);
    long size = ftell(file);
    fseek(file, 0, SEEK_SET);
    int lines = 0;
    char c;
    for (long i = 0; i < size; i++) {
        c = fgetc(file);
        if (c == '\n') {
            lines++;
        }
    }
    // 处理文件不以换行符结尾的情况
    if (c != '\n' && size > 0) {
        lines++;
    }
    fclose(file);
    return lines;
}
int main() {
    const char *filename = "example.txt";
    int line_count = count_lines(filename);
    if (line_count != -1) {
        printf("文件 %s 有 %d 行\n", filename, line_count);
    }
    return 0;
}

注意事项

  1. 方法1和方法2更可靠,特别是方法2(fgets)是最简单直接的方式
  2. 方法3(fseek/ftell)在某些情况下可能不准确,不推荐使用
  3. 所有方法都需要处理文件打开失败的情况
  4. 对于非常大的文件,方法2(fgets)可能更高效,因为它不需要逐个字符处理
  5. 确保在文件操作后关闭文件,避免资源泄漏

选择哪种方法取决于你的具体需求和文件的特点,对于大多数情况,方法2(fgets)是最简单可靠的选择。

-- 展开阅读全文 --
头像
C语言程序无法启动,原因何在?
« 上一篇 今天
织梦模板如何增加自定义模块?
下一篇 » 今天

相关文章

取消
微信二维码
支付宝二维码

目录[+]