Help me out with fread()

Whats wrong with the code it’s giving WA ?

using namespace std;

int main(){

freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);

int n, num = 0, k, count = 0;
char buf[30000];
scanf("%d %d", &n, &k);
//int charRead = fread(buf, 1, 30000, stdin);
int t = 0;
while(t < n){
int charRead = fread(buf, 1, 30000, stdin);
for(int i=0; i<charRead; i++){
	if(buf[i] == '\n'){
		if(num%k == 0) count++;
		num = 0;
	    num = num*10 + (buf[i] - '0');
printf("%d\n", count-1);
return 0;



As WA verdict depends on the question so you must also post the problem link.

1 Like

sorry , just edited the post with the link!

1 Like

Guesses as to what is going wrong:

  1. Possibly the test input uses uses windows line endings (containing a \r) - I don’t know whether C’s input will auto-convert for you. I think this might be the least likely explanation.
  2. There’s a flaw in that, because you don’t consume the carriage return from the first line (the one with n and k on it), the first integer “read” is always 0, which eats up one of your n's and which is divisible by k (which is why you are subtracting one from count before you print it!)
    Now, if the final number is not fully contained in the current buffer after reading the second-to-final number, then the loop will finish without ever reading the final number (because the spurious 0 read at the beginning eats up one of your n's), which will give the wrong answer if this final number is divisible by k.


The results might vary from platform to platform, but I think this exemplifies the problem - it has 2728 copies of the number 1000000000 (divisible by k = 4), but on my machine at least, your program gives the output 2727. It’s specifically tailored to break things if the buffer size is 30000.

1 Like

You just have to check how many elements of array are divisible by k.

1 Like