SD1990
SD1990

Reputation: 808

Simple count how many integers are in file in C

Im currently learning C through random maths questions and have hit a wall. Im trying to read in 1000 digits to an array. But without specifiying the size of an array first i cant do that. My Answer was to count how many integers there are in the file then set that as the size of the array. However my program returns 4200396 instead of 1000 like i hoped. Not sure whats going on.

my code: EDIT

#include <stdio.h>
#include <stdlib.h>

int main (void)
{
    FILE* fp;
    const char filename[] = "test.txt";
    char ch;
    int count = 0;

    fp = fopen(filename, "r");
    if( fp == NULL )
    {
        printf( "Cannot open file: %s\n", filename);
        exit(8);
    }

    do
    {
        ch = fgetc (fp);
        count++;
    }while (ch != EOF);

    fclose(fp);

    printf("Text file contains: %d\n", count);


    return EXIT_SUCCESS;
}

test.txt file:

731671765313306249192251196744265747423553491949349698352031277450632623957831801698480186947885184385861560789112949495459501737958331952853208805511
125406987471585238630507156932909632952274430435576689664895044524452316173185640309871112172238311362229893423380308135336276614282806444486645238749
303589072962904915604407723907138105158593079608667017242712188399879790879227492190169972088809377665727333001053367881220235421809751254540594752243
525849077116705560136048395864467063244157221553975369781797784617406495514929086256932197846862248283972241375657056057490261407972968652414535100474
821663704844031998900088952434506585412275886668811642717147992444292823086346567481391912316282458617866458359124566529476545682848912883142607690042
242190226710556263211111093705442175069416589604080719840385096245544436298123098787992724428490918884580156166097919133875499200524063689912560717606
0588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450

Any help would be great.

Upvotes: 0

Views: 5523

Answers (4)

Tomas Pruzina
Tomas Pruzina

Reputation: 8887

If you want number of digits thin you tave to do it char-by-char e.g:

while (isdigit(fgetc(file_decriptor))
    count++;

Look up fgetc, getc and scanf in manpages, you don't seem to understand whats going on in your code.

Upvotes: 1

Mat
Mat

Reputation: 206699

Turn on your compiler's warnings (-Wall), it will tell you that you didn't initialize count, which is a problem: it could contain absolutely anything when your program starts.

So initialize it:

int count = 0;

The other problem is that the scanfs won't do what you want, at all. %d will match a series of digits (a number), not an individual digit. If you do want to do your counting like that, use %c to read individual characters.

Another approach typically used (as long as you know the file isn't being updated) is to use fseek/ftell to seek to the end of the file, get the position (wich will tell you its size), then seek back to the start.

The fastest approach though would be to use stat or fstat to get the file size information from the filesystem.

Upvotes: 1

Fred
Fred

Reputation: 17085

The way C initializes values is not specified. Most of the time it's garbage. Your count variable it's not initialized, so it mostly have a huge value like 1243435, try int count = 0.

Upvotes: 0

Fred Foo
Fred Foo

Reputation: 363587

You forgot to initialize count, so it contains random garbage.

int count = 0;

(But note that with this change it's still not going to work, since %d in a scanf format means read as many digits as you find rather than read a single digit.)

Upvotes: 4

Related Questions