fscanf csv in C. Value not assigned
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:UsersFinleyDesktopProgrammingQuizMachineQuizMachinefscanf_questions.txt", "r");
if (reader == NULL)
{
printf("Unable to Open File: %sn", 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
.@Daniel
fscanf()
should limit input to prevent buffer corruption. The width specifier is typically 1 less than the size of the buffer.
char Question[51];
fscanf(reader, "%50[^,],", Question);
The result of fscanf()
should be checked.
if (fscanf(reader, "%50[^,],%29[^,],%29[^,],%29[^,],%29[^,],%1s",
Question, OptionOne, OptionTwo, OptionThree, OptionFour, answer) != 6) {
Handle_Bad_input();
}
Do not use "%[^,]"
for the last value if input does not have a following ','
, else fscanf()
will read the next line.
Suggest leading each "[^,]"
with a space to skip leading white-space.
if (fscanf(reader, " %50[^,], %29[^,], %29[^,], %29[^,], %29[^,],%1s",
Even better: Read the line with fgets()
and then scan the buffer.
char buf[200];
if (fgets(buf, sizeof buf, reader) == NULL) Handle_IOErrorOrEOF();
if (sscanf(buffer, "%50[^,],%29[^,],%29[^,],%29[^,],%29[^,],%1s",
Question, OptionOne, OptionTwo, OptionThree, OptionFour, answer) != 6) {
Handle_Bad_input();
}
Your buffer for answer
is too small, so fscanf
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,