Я использую fscanf для чтения некоторых значений из CSV-файла и хочу убедиться, что данные, считанные в значения, не будут слишком большими и вызовут переполнение буфера.
Мой CSV-файл имеет формат int, string, string и мой код для чтения ниже (я исправлю условие while позже):
while(fscanf(f, "%d,%[^,],%[^,]", &inArray[i].ID, inArray[i].label, inArray[i].brand)/*insert while condition here*/
При использовании scanf я бы указывал такую длину, чтобы избежать переполнения: scanf("%20f", example);
Но если я попробую то же самое с вышеупомянутым: while(fscanf(f, "%d,%20[^,],%10[^,]", &inArray[i].ID, inArray[i].label, inArray[i].brand)/*insert while condition here*/
Я получаю сбой, когда код выполняется.
Пытаться fscanf_s
эта функция имеет улучшения безопасности.
http://msdn.microsoft.com/en-us/library/6ybhk9kc(v=vs.90).aspx
Вы не можете сделать это с помощью fprintf при чтении символов.
Сначала я прочитал бы всю строку, например, с getline()
найдите разделители (или токенизируйте строку), а затем проанализируйте отдельные элементы.
Кстати, причиной вашего сбоя также может быть неправильное определение / инициализация inArray
,
ОП, вероятно, использовал неправильную ширину в fscanf()
,
Хотя ОП не публиковал подробности о inArray[i]
давайте предположим, что это было
struct {
int ID;
char label[20];
char brand[10];
} inArray[100];
Формат должен быть
"%d,%19[^,],%9[^,]"
Ширина 19 должна быть на 1 меньше, чем размер пункта назначения, таким образом, оставляя место для ‘\ 0’.