2013-09-17 3 views
0

Я использую fscanf для чтения некоторых значений из файла CSV, и я хочу, чтобы данные, считанные в значениях, не были слишком большими и вызывают переполнение буфера.Предотвращение переполнения буфера при использовании fscanf

Мой файл CSV имеет формат INT, строка, строка и мой код, чтобы прочитать ниже (я буду фиксировать состояние позже):

while(fscanf(f, "%d,%[^,],%[^,]", &inArray[i].ID, inArray[i].label, inArray[i].brand)/*insert while condition here*/ 

При использовании зсапЕ я бы указать длину, как так предотвратить переполнение: scanf("%20f", example);

Но если попробовать то же самое с выше: while(fscanf(f, "%d,%20[^,],%10[^,]", &inArray[i].ID, inArray[i].label, inArray[i].brand)/*insert while condition here*/

я получаю аварии, когда код выполняется.

+1

Вы пробовали отладку? Это сбой на первой итерации вашего цикла? Как вы инициализируете 'i'? – Hulk

+1

Если вы хотите изучить способ чтения форматированного ввода C++, вы, вероятно, захотите посмотреть [cppreference on istream operator >>] (http://en.cppreference.com/w/cpp/io/basic_istream/operator_gtgt) – Hulk

ответ

2

Вы не можете делать это с fprintf при чтении символов.

Сначала я прочитал всю строку, например, с помощью getline(), расположил разделители (или обозначил линию), а затем проанализировал отдельные элементы.

Btw., Причиной для вас может быть неправильное определение/инициализация inArray.

0

OP вероятно использовал неправильную ширину в fscanf().

Хотя ОП не отправлял подробности о inArray[i] давайте предположим, что это был

struct { 
    int ID; 
    char label[20]; 
    char brand[10]; 
} inArray[100]; 

Формат должен затем быть

"%d,%19[^,],%9[^,]" 

Ширина 19 потребностей быть 1 меньше, чем размер назначения , таким образом позволяя пятно для '\ 0'.

Смежные вопросы