Проблема в том, что спецификатор формата %s
останавливает сканирование всякий раз, когда обнаруживается whitespece char (пробел, табуляция, новая строка и т. Д.).
Вот почему оба «История игрушек» и «Четыре комнаты» хранятся в двух разных полях вашей структуры, что заставляет сканирование буквально «сдвигать» позиции (поле жанра первого mov ie будет стать первым полем второго mov ie и так далее).
Вместо %s
вы можете использовать %[^\t]
.
Квадратные скобки спецификатор формата просматривает строку, содержащую набор символов. Но если присутствует ^
, содержащийся символ избегается. Таким образом, в данном случае это означает "сохранить строку и останавливаться при обнаружении первой вкладки" .
Еще лучше: вы можете сохранить не более N символов, используя формат %N[^\t]
. Учитывая размер вашего целевого массива, просто укажите N как этот размер минус один (оставив место для терминатора строки).
Ваш fscanf
станет примерно таким:
fscanf(MovieF, "%49[^\t]%49[^\t]%49[^\t]%99[^\t]%99[^\t]\n",
Movie[i].MID, Movie[i].MName, Movie[i].MYear,
Movie[i].MDate, Movie[i].MIMDB, Movie[i].MGen);