I posted a problem yesterday regarding a certain segment of my code. The aim was to basically scan in data values from a .dat file into an array, print the values whilst also counting how many values were in the file.
Sounds pretty simple, but my program only seemed to print a certain number of the values. More specifically, of a data file containing over 300000 values, it would only print the last 20000 and nothing else.
So I left it, finished the rest of my code and now it’s the last part I have to sort. I’ve made a few changes and tried actually printing an output .dat file now so I can see what I’m getting. The code is below by the way.
Initally I assumed perhaps it was something related to the memory allocation of my array (was getting a segmentation error? when putting the whole code together) so I created an external function that counted the number of values instead (that works).
My only problem now is that it still only chooses to print 20000 values and then the rest are 0s. I was thinking perhaps it had something to do with the type but they all contain 7 dps in scientific notation. Here’s a sample of some of the values:
8.4730000e+01 1.0024256e+01
8.4740000e+01 8.2065599e+00
8.4750000e+01 8.3354644e+00
8.4760000e+01 8.3379525e+00
8.4770000e+01 9.8741315e+00
8.4780000e+01 9.0966478e+00
8.4790000e+01 9.4760274e+00
8.4800000e+01 7.1199807e+00
8.4810000e+01 7.1990172e+00
Anyone see where I’m going wrong? I’m sorry for the long question, it’s just been bugging me for the last day or so and no matter what I change nothing seems to help. Any kind of input would be greatly appreciated.
#include <stdio.h>
#include <stdlib.h>
int count(int);
const char df[]="data_file.dat";
const char of[]="output_file.dat";
int main(int argc, char *argv[])
{
FILE *input, *output;
int i, N;
float *array;
N = count(i);
input = fopen(df, "r");
output = fopen(of, "w");
array = (float*)malloc(N*sizeof(float));
if((input != (FILE*) NULL) && (output != (FILE*) NULL))
{
for(i = 0; i < N; i++)
{
fscanf(input, "%e", &array[i]);
fprintf(output, "%d %e\n", i, array[i]);
}
fclose(input);
fclose(output);
}
else
printf("Input file could not be opened\n");
return(0);
}
int count(int i)
{
FILE *input;
input = fopen(df, "r");
int N = 0;
while (1)
{
i = fgetc(input);
if (i == EOF)
break;
++N;
}
fclose(input);
return(N);
}
Your biggest problem is that
count()doesn’t count float values; it counts how many characters are in the file. Then you try to loop and callfscanf()more times than there are values in the file. The first times,fscanf()finds a float value and scans it; but once the loop reaches the end of file,fscanf()will be returning an EOF status. It seems possible thatfscanf()will set the float value to0.0when it returns EOF.I suggest you rewrite so that you don’t try to pre-count the float values. Write a loop that just repeatedly calls
fscanf()until it returns an EOF result, then break out of the loop and close the files.P.S. If you are going to write a function like
count(), you should pass in the filename as an argument instead of hard-coding it. And your version ofcount()takes an integer argument but just ignores the value; instead, just declare a temp variable inside ofcount().EDIT: Okay, here is a complete working program to solve this problem.
Note that this version doesn’t need to allocate a large array; it just needs a single temporary float variable. Maybe your program will need to store all the float values. In that case, write a
count()function that uses a loop similar to the above loop, usingfscanf()to count float values.Also note that this program checks for errors after calling
fopen()andfscanf().