в кавычки, может содержать символыдвойных
Поля разделены запятыми.
Поле может быть заключено в двойные кавычки: "...".
Поле, заключенное в кавычки, может содержать
запятые,но не символы перевода строки.
Поле, заключенное в кавычки, может содержать символыдвойных кавычек, представляемые парой
двойных кавычек Поле может быть пустым;
"" и пустая строка равно представляют пустое
поле. Предваряющие и заключительные пробелы сохраняются.
char *csvgetline(FILE *f);
читает одну строку из файла ввода f;
подразумевается, что строки во вводе
оканчиваются символами \г, \п, \г\пилиЕОЕ.
возвращает указатель на строку
(символы конца строки
удаляются) или NULL, если достигнут EOF.
строки могут иметь произвольную длину; возвращается
NULL, если превышен резерв памяти, строки
рассматриваются как память,
доступная только для чтения;
для сохранения или изменения содержимого
вызывающая сторона должна сделать копию.
char *csvfield(int n);
поля нумеруются начиная с 0. возвращает n-е поле
из последней строки, прочитанной csvgetline;
возвращает NULL, если n отрицательно или лежит
за последним полем, поля разделяются запятыми.
поля могут быть заключены в двойные кавычки, эти кавычки убираются;внутри двойных кавычек
запятая не являетсяразделителем, а пара
символов "" заменяется на ". в полях, не ограниченных кавычками, кавычки
рассматриваютсякак обычные символы, может
быть произвольное количество полей любой
длины;возвращает NULL, если превышается
резерв памяти, поля рассматриваются как память, доступная только для чтения;
для сохранения или изменения содержимого
вызывающая сторона должна сделать копию,
при вызове до csvgetline поведение не определено.
int csvnfield(void);
возвращает количество полей в последней строке,
прочитанной csvgetIi ne. при вызове до csvget line
поведение не определено.
Представленная спецификация все еще оставляет некоторые вопро- < сы открытыми. Например, какие значения должны возвращать csvf ield и csvnf ield, если они вызваны после того, как csvgetline натолкнулась на EOF? Разрешить подобные головоломки непросто даже для маленькой I программы, а для больших систем — исключительно трудно, но очень важно хотя бы попробовать с ними справиться.В противном случае вы рискуете обнаружить пробелы и недочеты уже в ходе реализации проекта.
Остаток параграфа посвящен новой реализации csvgetl i ne, которая COOT- | ветствует нашей спецификации. Библиотека разбита на два файла — заголовочный csv. h и файл воплощения csv. с. В заголовочном файле содержатся объявления функций, то есть представлена общедоступная часть интерфейса. В csv. с содержится собственно рабочий код библиотеки — реализации функций. Пользователи включают csv. h в свой исходный код и компонуют свой скомпилированный код со скомпилированной версией csv. с; таким образом, исходный код библиотеки никогда не должен быть видим.
Содержание раздела