Я анализирую текстовый (css) файл, используя fscanf. Основная цель проста; Я хочу вытащить все, что соответствует этому шаблону:
@ import "some / file /where.css";
Так что я использую fscanf, говорю ему читать и отбрасывать все до символа «@», а затем хранить все, пока не достигнет «;» персонаж. Вот функция, которая делает это:
char* readDelimitedSectionAsChar(FILE *file)
{
char buffer[4096];
int charsRead;
do
{
fscanf(file, "%*[^@] %[^;]", buffer, &charsRead);
} while(charsRead == 4095);
char *ptr = buffer;
return ptr;
}
Я создал буфер, который должен содержать 4095 символов, насколько я понимаю. Тем не менее, я обнаружил, что это не так. Если у меня есть файл, который содержит соответствующую длинную строку, например:
@ import "некоторые / действительно / действительно / действительно / длинные / file / path / to / a / file";
Это усекается до 31 символа, используя буфер char [4096]. (Если я использую printf для проверки значения буфера, я обнаружу, что строка обрезана.)
Если я увеличу размер буфера, будет добавлено больше строки. У меня сложилось впечатление, что один символ занимает один байт (хотя я знаю, что это зависит от кодировки). Я пытаюсь понять, что здесь происходит.
В идеале, я бы хотел иметь возможность устанавливать буфер настолько большим, насколько это необходимо, чтобы он был «на лету», то есть fscanf просто создает буфер, достаточно большой для хранения строки. Можно ли это сделать? (Мне известен флаг% as для GNU, но это приложение Mac для OS 10.5 / 10.6, и я не уверен, будет ли это работать на этой платформе.)