2014-01-21 63 views
0

所以我想要做的是計算空行,這意味着不僅僅包含'\ n'空格和製表符符號。任何幫助表示讚賞! :)如何計算C中文件的空行?

char line[300]; 
int emptyline = 0; 
FILE *fp; 
fp = fopen("test.txt", "r"); 
if(fp == NULL) 
{ 
    perror("Error while opening the file. \n"); 
    system("pause"); 
} 
else 
{ 
    while (fgets(line, sizeof line, fp)) 
    { 
     int i = 0; 
     if (line[i] != '\n' && line[i] != '\t' && line[i] != ' ') 
     { 
      i++; 
     } 
     emptyline++; 
    } 
    printf("\n The number of empty lines is: %d\n", emptyline); 
} 
fclose(fp); 
+0

爲什麼不閱讀手冊頁 - http://www.cplusplus.com/reference/cstdio/fgets/ - 'fgets'讀取一行。你需要檢查它是空白的。 –

+0

你應該'繼續'或者用'換行'來包裝'emptyline ++' – Billie

回答

0

在進入線循環之前,遞增emptyLine計數器,並且如果非空白字符被計數,則遞減emptyLine計數器然後中斷循環。

#include <stdio.h> 
#include <string.h> 

int getEmptyLines(const char *fileName) 
{ 
    char line[300]; 
    int emptyLine = 0; 
    FILE *fp = fopen("text.txt", "r"); 
    if (fp == NULL) { 
     printf("Error: Could not open specified file!\n"); 
     return -1; 
    } 
    else { 
     while(fgets(line, 300, fp)) { 
      int i = 0; 
      int len = strlen(line); 
      emptyLine++; 
      for (i = 0; i < len; i++) { 
       if (line[i] != '\n' && line[i] != '\t' && line[i] != ' ') { 
        emptyLine--; 
        break; 
       } 
      } 
     } 
     return emptyLine; 
    } 
} 

int main(void) 
{ 
    const char fileName[] = "text.txt"; 
    int emptyLines = getEmptyLines(fileName); 
    if (emptyLines >= 0) { 
     printf("The number of empty lines is %d", emptyLines); 
    } 
    return 0; 
} 
1

你應該試着讓你的代碼在SO上發佈時是正確的。您正在遞增iemptyline,但在撥打printf()時使用el。然後我不知道它應該在你的代碼中有什麼}ine。請至少努力一下。

對於初學者,您正在爲每行增加emptyline,因爲它在您的if語句之外。

其次,您需要測試整行以查看它是否包含任何不是空白字符的字符。只有如果這是真的,你應該增加emptyline

int IsEmptyLine(char *line) 
{ 
    while (*line) 
    { 
     if (!isspace(*line++)) 
      return 0; 
    } 
    return 1; 
} 
0

您在每次迭代遞增emptyline,所以你應該把它包在一個else塊。

0

讓我們從邏輯上考慮這個問題,並讓我們使用函數來明確發生了什麼。

首先,我們要檢測只包含空白的行。所以讓我們創建一個功能來做到這一點。

bool StringIsOnlyWhitespace(const char * line) { 
    int i; 
    for (i=0; line[i] != '\0'; ++i) 
     if (!isspace(line[i])) 
      return false; 
    return true; 
} 

既然我們有一個測試函數,讓我們圍繞它構建一個循環。

while (fgets(line, sizeof line, fp)) { 
    if (StringIsOnlyWhitespace(line)) 
     emptyline++; 
} 

printf("\n The number of empty lines is: %d\n", emptyline); 

注意fgets()不會返回上至少有sizeof(line)字符線全線(只是其中的一部分)。