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;
}
fclose(file);
return lines;
}
int main(int argc, char *argv[]) {
if (argc != 2) {
printf("用法: %s <文件名>\n", argv[0]);
return 1;
}
int line_count = count_lines(argv[1]);
if (line_count >= 0) {
printf("文件 %s 有 %d 行\n", argv[1], 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(int argc, char *argv[]) {
if (argc != 2) {
printf("用法: %s <文件名>\n", argv[0]);
return 1;
}
int line_count = count_lines(argv[1]);
if (line_count >= 0) {
printf("文件 %s 有 %d 行\n", argv[1], 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);
rewind(file);
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(int argc, char *argv[]) {
if (argc != 2) {
printf("用法: %s <文件名>\n", argv[0]);
return 1;
}
int line_count = count_lines(argv[1]);
if (line_count >= 0) {
printf("文件 %s 有 %d 行\n", argv[1], line_count);
}
return 0;
}
注意事项
- 文件末尾没有换行符的情况:需要单独处理,否则会少计数一行
- 空文件:空文件应该返回0行
- 错误处理:应该检查文件是否成功打开
- 大文件:方法1和方法2可以处理大文件,方法3可能不适用于非常大的文件
最推荐的方法
方法2(使用fgets)是最推荐的,因为:
- 代码简洁明了
- 直接按行处理,逻辑清晰
- 自动处理各种换行符情况
- 效率较高
你可以根据实际需求选择最适合的方法。
