[英]How to count number of lines in a file in C?
我有一個功能,該功能應該計算用戶輸入的文件中的行數。 但是,無論何時輸入文件,我的函數都會返回0行。
int findnum_lines(FILE* fp){
int num_lines = 0;
char line;
int size;
size = ftell(fp);
line = getc(fp);
if(size != 0){
while(line != EOF){
if(line == '\n'){
num_lines = num_lines + 1;
}
line = getc(fp);
}
} else {
num_lines = 0;
}
printf("%d", num_lines);
return num_lines;
}
int main(int argc, char* argv[]){
char** lines = NULL;
int num_lines = 0;
FILE* fp = validate_input(argc, argv);
num_lines = findnum_lines(fp);
read_lines(fp, &lines, &num_lines);
print_lines(lines, num_lines);
free_lines(lines, num_lines);
fclose(fp);
return 0;
}
我的示例文件是:
Hello Class
This is what I would call a normal file
It isn't very special
But it still is important
所以我的函數應該返回4行,而不是0。
更新:
int findnum_lines(FILE* fp){
int num_lines = 0;
int line;
line = getc(fp);
while(line != EOF){
if(line == '\n'){
num_lines = num_lines + 1;
}
line = getc(fp);
}
printf("%d", num_lines);
return num_lines;
}
int main(int argc, char* argv[]){
char** lines = NULL;
int num_lines = 0;
FILE* fp = validate_input(argc, argv);
num_lines = findnum_lines(fp);
read_lines(fp, &lines, &num_lines);
print_lines(lines, num_lines);
free_lines(lines, num_lines);
fclose(fp);
return 0;
}
使用此更新的代碼,不會打印num_lines。
ftell
報告文件中的當前位置。 對於剛剛打開的文件,位置是開始,而ftell
返回零。 然后,由於size
為零,因此findnum_lines
的循環處理零個字符,並報告未找到任何行。
通常,您不希望獲取文件大小然后循環播放。 原因之一是文件在讀取時可能會更改-其他進程可能會向其中寫入更多數據或截斷它。 另一個原因是不必要的。 使用while
循環(或do … while
循環)讀取字符,直到獲得EOF
。
另外, char line;
應該是int line;
因為它用於保存getc
的結果,該結果可以是字符也可以是EOF
,而char
不足以保存EOF
。 (此外, getc
將字符的值作為unsigned char
轉換為int
,因此,在對char
進行簽名的實現中, char
甚至無法正確表示所有字符。)
一個問題是對ftell()
的調用是在文件偏移仍為零的情況下完成的:
int findnum_lines(FILE* fp){
int num_lines = 0;
int line; // changed char to int
int size;
size = ftell(fp);
line = getc(fp);
if(size != 0){
while(line != EOF){
if(line == '\n'){
num_lines = num_lines + 1;
}
line = getc(fp);
}
} else {
num_lines = 0;
}
printf("%d", num_lines);
return num_lines;
}
如果打開文件后立即調用findnum_lines()
則ftell()
返回的文件當前偏移量將位於文件的開頭-或為零。
因此num_lines
設置為零,並且返回零。
請注意,不需要檢查文件大小-因為您要計算換行符- '\\n'
n'-長度為零的文件將包含零個換行符以進行計數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.