Вы можете посмотреть на getdelim(',', fin, line)
,
Но другой проблемой будут эти кавычки, если только вы / не знаете / файл всегда форматируется именно таким образом, это становится трудным.
Один взлом, который я использовал в прошлом, НЕ СОВЕРШЕННЫЙ, если первый символ - кавычка, то последний символ перед запятой также должен быть совпадающей кавычкой и не быть экранированным.
Если это не кавычка, то getdelim()
еще немного, но функция автоматического выделения в getdelim означает, что вы должны использовать другой буфер.В C ++ я получаю вектор всех частей результатов getdelim
, которые затем необходимо объединить, чтобы получить окончательную строку:
std::vector<char*> gotLine;
gotLine.push_back(malloc(2));
*gotLine.back() = fgetch();
gotLine.back()[1] = 0;
bool gotquote = *gotLine.back() == '"'; // perhaps different classes of quote
if (*gotLine.back() != ',')
for(;;)
{
char* gotSub= nullptr;
gotSub=getdelim(',');
gotLine.push_back(gotSub);
if (!gotquote) break;
auto subLen = strlen(gotSub);
if (subLen>1 && *(gotSub-1)=='"') // again different classes of quote
if (sublen==2 || *(gotSub-2)!='\\') // needs to be a while loop
break;
}
Затем просто объединить все эти сегменты строк обратно вместе.
Обратите внимание, что getdelim поддерживает нулевые байты.Если вы ожидаете нулевые байты в содержимом и не представлены последовательностями символов \000
или \@
, вам необходимо сохранить фактическую длину, возвращаемую getdelim, и использовать memcpy для их объединения.
Oh, иесли вы разрешите расширенные кавычки utf-8, это станет очень грязным!
Случай, который не покрывает это строка, которая заканчивается \\"
или \\\\"
.В идеале вам нужно посчитать количество ведущих обратных слешей и принять кавычку, если счет четный.
Обратите внимание, что это оставляет проблему удаления текста в кавычках, т. Е. Преобразования любых \"
в "
, \\
в \
и т. Д. Также отбрасывая кавычки.
В конце концов, библиотека может быть проще, если вам нужно иметь дело с совершенно произвольным контентом.Но если контент «известен», вы можете жить без него.