Поля разделены запятыми. Поле может быть заключено в двойные кавычки: "...". Поле, заключенное в кавычки, может содержать запятые,но не символы перевода строки. Поле, заключенное в кавычки, может содержать символыдвойных кавычек, представляемые парой двойных кавычек Поле может быть пустым; "" и пустая строка равно представляют пустое поле. Предваряющие и заключительные пробелы сохраняются. 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. с; таким образом, исходный код библиотеки никогда не должен быть видим.