在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和方法2更可靠,特别是方法2(fgets)是最简单直接的方式
- 方法3(fseek/ftell)在某些情况下可能不准确,不推荐使用
- 所有方法都需要处理文件打开失败的情况
- 对于非常大的文件,方法2(fgets)可能更高效,因为它不需要逐个字符处理
- 确保在文件操作后关闭文件,避免资源泄漏
选择哪种方法取决于你的具体需求和文件的特点,对于大多数情况,方法2(fgets)是最简单可靠的选择。
