Reputation: 808
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
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
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 scanf
s 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
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
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