I have attempted to make a file to read a text file that contains CSVs. For some reason however some of the Fscanfs do not return a value but some do.
FILE* reader;
char OptionOne[30]="";
char OptionTwo[30]="";
char OptionThree[30]="";
char OptionFour[30]="";
char answer[1]="";
char CorrectAnswer[1];
char Question[51];
reader = fopen("C:\\Users\\Finley\\Desktop\\Programming\\QuizMachine\\QuizMachine\\fscanf_questions.txt", "r");
if (reader == NULL)
{
printf("Unable to Open File: %s\n", FileName);
}
fscanf(reader, "%[^,],", Question);
fscanf(reader, "%[^,],", OptionOne);
fscanf(reader, "%[^,],", OptionTwo);
fscanf(reader, "%[^,],", OptionThree);
fscanf(reader, "%[^,],", OptionFour);
fscanf(reader, "%[^,],", answer);
Why does the first fscanf return a value but all the others not return a value. I cannot see anything and they all seem the same with the same formating File formatting is like this:
What function do you use to open a file?,fscanf,fclose,fopen,main,3
Which of the following is not a variable type?,int,float,char,string,4
Need to use buffers of adequate size. The answer, as a string needs at least 2
char
.@Danielfscanf()
should limit input to prevent buffer corruption. The width specifier is typically 1 less than the size of the buffer.The result of
fscanf()
should be checked.Do not use
"%[^,]"
for the last value if input does not have a following','
, elsefscanf()
will read the next line.Suggest leading each
"[^,]"
with a space to skip leading white-space.Even better: Read the line with
fgets()
and then scan the buffer.Your buffer for
answer
is too small, sofscanf
is writing too much into it leading to corruption.You gave it a size of only one character, but
fscanf
will write two characters into it: the character you wanted, 3, and the null character,\0
.Increasing the buffer size to 2 solves the problem.