รหัสนับไม่ถูกต้องเนื่องจากตัวเลขทั้งหมดในผลลัพธ์ต่ำกว่าที่ควรจะเป็น ฉันไม่สามารถหาเหตุผลใดๆ ว่าทำไมฉันถึงได้ตัวเลขเหล่านี้ เนื่องจากฉันยังไม่เข้าใจ c เป็นอย่างดี

ถ้าฉันอ่านในไฟล์ที่มี 25 บรรทัด 20 บรรทัด ไม่รวมพื้นที่สีขาวและแสดงความคิดเห็น ผลลัพธ์จากโค้ดของฉันจะเป็น 10 และ -13 และฉันไม่แน่ใจว่าทำไม ความช่วยเหลือใด ๆ ที่ชื่นชมอย่างมาก

#include <stdio.h>
#include <string.h>
#define LINE_LENGTH 1000
    
int main(int argc, char **argv)
{   
    FILE *input_file = fopen("cstest.c", "r");
        
        
    char line [LINE_LENGTH];
        
    //while loop to get
    while(fgets(line,LINE_LENGTH,input_file)!=NULL)
    {   
        int ch=0;//ch is the cast
        int lines=0;
    
        if (input_file == NULL) 
            return 0;
        
        while(fgetc(input_file)!= EOF)
        {
    
            ch = fgetc(input_file);
    
            if(ch == '\n')
            {
                lines++;
            }
            
        
        }//end while
        printf("lines: %d\n",lines);
    }//end while loop 

    
    rewind(input_file);
        
        
    while(fgets(line,LINE_LENGTH,input_file)!=NULL)
    {   
        int ch=0;//ch is the cast
        int lines=0;
        char c;
        if (input_file == NULL) 
            return 0;
        
        while(fgetc(input_file)!= EOF)
        {
            ch = fgetc(input_file);
            if(ch == '\n')
            {
                lines++;
            }
    
            if(ch == '\n' && ch + 1 == '\n' || ch == '\t')
            {
                lines--;
            }
        
        
    
        }//end while
        
        printf("lines excluding white space and comments: %d\n",lines);
        

    }//end while loop

    fclose(input_file);
}
ตอบ

คุณกำลังข้ามหลายสิ่งหลายอย่าง

ขั้นแรก บรรทัดจะถูกอ่านโดยเงื่อนไขนี้:

while(fgets(line,LINE_LENGTH,input_file)!=NULL)

สายนี้จะไม่ถูกอ่านโดยการfgetc()โทร ในภายหลัง ดังนั้นคุณจะไม่นับขึ้นบรรทัดใหม่ที่ท้ายบรรทัดนี้

จากนั้นในลูปถัดไปของคุณ:

        while(fgetc(input_file)!= EOF)
        {
            ch = fgetc(input_file);
            if(ch == '\n')
            {
                lines++;
            }
        }//end while

คุณตรวจสอบเฉพาะอักขระอื่น ๆ ทั้งหมดเพื่อดูว่าเป็นการขึ้นบรรทัดใหม่หรือไม่ คุณอ่านอักขระหนึ่งตัวในwhile()เงื่อนไขและตรวจสอบว่าใช่EOFหรือไม่ จากนั้นคุณอ่านอักขระอื่นในเนื้อหาของลูปและทดสอบว่าเป็น `\ n' หรือไม่

คุณไม่จำเป็นต้องวนซ้ำซ้อนหรือหลายสายไปยังfgetc().

    int ch;
    while((ch = fgetc(input_file))!= EOF)
    {
        if(ch == '\n')
        {
            lines++;
        }
            
        
    }//end while
    printf("lines: %d\n",lines);

คุณต้องการเพียงหนึ่งวนรอบfgetsกำลังอ่านทั้งบรรทัดสำหรับคุณ บาร์มาร์แก้ไขทางหนึ่ง ฉันไปทางอื่น

int lines = 0;
//while loop to get
while (fgets(line, LINE_LENGTH, input_file) != NULL)
{
    int ch = 0;//ch is the cast
    lines++;

      //while (fgetc(input_file) != EOF)
    //{

    //    ch = fgetc(input_file);

    //    if (ch == '\n')
    //    {
    //        lines++;
    //    }


    //}//end while
    printf("lines: %d\n", lines);
}//end while loop