Как использовать scanf\fscanf для чтения строки и разбора на переменные?

Я пытаюсь прочитать текстовый файл, созданный в следующем формате в каждой строке:

символ*,символ*,целое число

i.e.:

ааааа, dfdsd, 23

bbbasdaa, ддд, 100

я хочу использовать fscanf для чтения строки из файла и автоматического анализа строки на переменные string1,string2,intA

Каков правильный способ сделать это? Спасибо


person RanH    schedule 05.03.2011    source источник
comment
Формат будет string, string, int: строки на самом деле не содержат адресов памяти, не так ли?   -  person Fred Foo    schedule 05.03.2011
comment
нет, мой плохой. будет так, как ты сказал   -  person RanH    schedule 05.03.2011


Ответы (2)


Предполагая, что у вас есть:

char string1[20];
char string1[20];
int intA;

вы могли бы сделать:

fscanf(file, "%19[^,],%19[^,],%d\n", string1, string2, &intA);

%[^,] читает строку символов без запятой и останавливается на первой запятой. 19 — это максимальное количество символов для чтения (при условии, что размер буфера равен 20), чтобы избежать переполнения буфера.

person casablanca    schedule 05.03.2011
comment
Что делать, если я не знаю (максимальную) длину строки? Должен ли я определить некоторую максимальную длину, несмотря ни на что? - person RanH; 05.03.2011
comment
Ага. Добро пожаловать в радость манипулирования строками в стиле C. Правильный ответ — использовать нечто похожее на C++ std::string. Ленивый ответ — популярный char foo[1000]. - person ChrisV; 05.03.2011

Если вы действительно не можете сделать никаких безопасных предположений о длине строки, вы должны использовать getline(). Эта функция принимает три аргумента: указатель на строку (char**), указатель на целое число, содержащее размер этой строки, и указатель на файл, и возвращает длину прочитанной строки. getline() динамически выделяет место для строки (используя malloc/realloc), поэтому вам не нужно знать длину строки и нет переполнения буфера. Конечно, это не так удобно, как fscanf, потому что приходится разбивать строку вручную.

Пример:

char **line=NULL;
int n=0,len;
FILE *f=fopen("...","r");

if((len=getline(&line,&n,f)>0)
{
...
}

free(line);
fclose(f);
person sl0815    schedule 06.03.2011