簡體   English   中英

如何計算C文件中的行數?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM