В настоящее время я тестирую новое дополнение к итератору на основе словаря на основе словаря ICU. У меня есть код, который позволяет мне проверять словосочетание на текстовом документе, но когда текстовый документ слишком велик, он дает ошибку: bash: ./a.out: слишком длинный список аргументовСправка Редактирование кода для исправления «Список аргументов слишком длинный» Ошибка
Я не уверен как отредактировать код, чтобы разбить список аргументов, когда он становится слишком длинным, чтобы файл любого размера мог быть запущен через код. Оригинальный автор кода довольно занят, кто-то захочет помочь?
Я попытался удалить распечатку того, что проверяется, чтобы узнать, поможет ли это, но я все еще получаю ошибку на больших файлах (печать того, что рассматривается, не требуется - мне просто нужен результат).
Если код может быть изменен, чтобы читать исходный текстовый файл по строкам и экспортировать результаты по строкам в другой текстовый файл (в конечном итоге со всеми строками, когда это будет сделано), это было бы идеально.
Код выглядит следующим образом:
/*
Written by George Rhoten to test how word segmentation works.
Code inspired by the break ICU sample.
Here is an example to run this code under Cygwin.
PATH=$PATH:icu-test/source/lib ./a.exe "`cat input.txt`" > output.txt
Encode input.txt as UTF-8.
The output text is UTF-8.
*/
#include <stdio.h>
#include <unicode/brkiter.h>
#include <unicode/ucnv.h>
#define ZW_SPACE "\xE2\x80\x8B"
void printUnicodeString(const UnicodeString &s) {
int32_t len = s.length() * U8_MAX_LENGTH + 1;
char *charBuf = new char[len];
len = s.extract(0, s.length(), charBuf, len, NULL);
charBuf[len] = 0;
printf("%s", charBuf);
delete charBuf;
}
/* Creating and using text boundaries */
int main(int argc, char **argv)
{
ucnv_setDefaultName("UTF-8");
UnicodeString stringToExamine("Aaa bbb ccc. Ddd eee fff.");
printf("Examining: ");
if (argc > 1) {
// Override the default charset.
stringToExamine = UnicodeString(argv[1]);
if (stringToExamine.charAt(0) == 0xFEFF) {
// Remove the BOM
stringToExamine = UnicodeString(stringToExamine, 1);
}
}
printUnicodeString(stringToExamine);
puts("");
//print each sentence in forward and reverse order
UErrorCode status = U_ZERO_ERROR;
BreakIterator* boundary = BreakIterator::createWordInstance(NULL, status);
if (U_FAILURE(status)) {
printf("Failed to create sentence break iterator. status = %s",
u_errorName(status));
exit(1);
}
printf("Result: ");
//print each word in order
boundary->setText(stringToExamine);
int32_t start = boundary->first();
int32_t end = boundary->next();
while (end != BreakIterator::DONE) {
if (start != 0) {
printf(ZW_SPACE);
}
printUnicodeString(UnicodeString(stringToExamine, start, end-start));
start = end;
end = boundary->next();
}
delete boundary;
return 0;
}
спасибо! -Nathan
Ах, да, это полезно.Нет, это не значит, что оболочка обрабатывает словосочетание - это просто для результирующего файла - сможете ли вы помочь изменить код, чтобы читать текст за строкой? – Nathan
Я случайно удалил свой комментарий :-) Чтобы прочитать файл в C++, см. Http://www.cplusplus.com/doc/tutorial/files/, разместите свой код, и я буду рад помочь вам ... –
Мне было интересно, куда это пошло :) В этом вопросе нуждается код, который нуждается в модификации для чтения по строкам. Я лично не знаю C++ - оригинальный код был создан кем-то, помогающим мне с подачей ICU, но он довольно занят, поэтому я думал, что буду искать в другом месте. Спасибо за вашу помощь! – Nathan