tariq
tariq

Reputation: 529

Count number of line using C

Is there a way to count the number of lines in my file using C?

Upvotes: 3

Views: 15991

Answers (5)

David C. Rankin
David C. Rankin

Reputation: 84561

One nagging issue that can effect the number of lines returned regardless of the method you use is whether the file contains a POSIX compliant '\n' at the end of the last line. There are a number of editors (and programs) that happily write the final amount of text to a file without the POSIX end-of-line. You can handle either case regardless of which method you use to determine the number of lines in a file.

If you are trying to determine the number of line in a large file, then you will definitely want a buffered read (e.g. reading multiple characters into a buffer, per-read) rather than a character-by-character approach. The can greatly improve the efficiency.

Putting those two pieces together, you can use either fgets or POSIX getline to determine the number of lines in a file fairly efficiently. For example with getline (which handles the line-end issue or you), you could do:

/** open and read each line in 'fn' returning the number of lines */
size_t nlinesgl (char *fn)
{
    if (!fn) return 0;

    size_t lines = 0, n = 0;
    char *buf = NULL;
    FILE *fp = fopen (fn, "r");

    if (!fp) return 0;

    while (getline (&buf, &n, fp) != -1) lines++;

    fclose (fp);
    free (buf);

    return lines;
}

With fgets, testing for additional text after the final newline is up to you, e.g.

/** note; when reading with fgets, you must allow multiple reads until
 *  '\n' is encountered, but you must protect against a non-POSIX line
 *  end with no '\n' or your count will be short by 1-line. the 'noeol'
 *  flag accounts for text without a '\n' as the last line in the file.
 */
size_t nlines (char *fn)
{
    if (!fn) return 0;

    size_t n = 0, noeol = 0;
    char buf[FILENAME_MAX] = "";
    FILE *fp = fopen (fn, "r");

    if (!fp) return 0;

    while (fgets (buf, FILENAME_MAX, fp)) {
        noeol = 0;
        if (!strchr (buf, '\n')) {
            noeol = 1;  /* noeol flag for last line */
            continue;
        }
        n++;
    }
    if (noeol) n++;     /* check if noeol, add 1 */

    fclose (fp);

    return n;
}

(note: you can add your own code to handle a fopen failure in each function.)

Upvotes: 0

Shamim Hafiz - MSFT
Shamim Hafiz - MSFT

Reputation: 22094

If you want to perform this programmatically, open the file in text mode and perform fgetc() operation until you reach end of file. Keep a count of number of times fgetc was called.

    FILE *fp = fopen("myfile.txt");
    int ch;
    int count=0;
    do
    {
        ch = fgetc(fp);
        if(ch == '\n') count++;   
    } while( ch != EOF );    

    printf("Total number of lines %d\n",count);

Upvotes: 4

Pete Wilson
Pete Wilson

Reputation: 8694

Please think for a moment about what you have to do to count lines in a file:

  1. Open the file for reading, maybe with fopen( );

  2. Read each line, one line at a time, maybe with fread( );

  3. Increment a line counter that you've initialized to zero earlier;

  4. Whwn end-of-file is returned from the next read of the file, you are done. printf( ) the line counter.

Upvotes: 0

COrthbandt
COrthbandt

Reputation: 191

If you are referring to the line number within your c source, most compilers support the __LINE__ macro. If you want to count line numbers of arbitrary text files in c, the following functions should be starting points:

  • fopen() to open a file for reading
  • fgets() to read lines
  • eof() to check for end of file
  • fclose() to close the file

Combining these into a line counter is left as an exercise to the reader :)

Upvotes: 3

Ben Voigt
Ben Voigt

Reputation: 283634

Try the wc command. Most linux distributions include it.

Upvotes: 2

Related Questions