C++ 帮助编辑要修复的代码";“参数列表太长”;错误

C++ 帮助编辑要修复的代码";“参数列表太长”;错误,c++,bash,icu,C++,Bash,Icu,目前,我正在对基于ICU字典的break迭代器进行一些测试。 我的代码允许我在文本文档上测试分词,但当文本文档太大时,会出现错误:bash:./a.out:参数列表太长 我不知道当参数列表变得太长时,如何编辑代码来分解参数列表,以便任何大小的文件都可以在代码中运行。原代码作者很忙,有人愿意帮忙吗 我尝试删除正在检查的内容的打印以查看是否有帮助,但在大文件上仍然会出现错误(不需要打印正在检查的内容-我只需要结果) 如果可以修改代码,逐行读取源文本文件,并将结果逐行导出到另一个文本文件中(完成后会得

目前,我正在对基于ICU字典的break迭代器进行一些测试。 我的代码允许我在文本文档上测试分词,但当文本文档太大时,会出现错误: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;
}
/*
George Rhoten为测试分词工作原理而编写。
代码灵感来源于break-ICU示例。
下面是一个在Cygwin下运行此代码的示例。
PATH=$PATH:icu-test/source/lib./a.exe“`cat-input.txt`>output.txt
将input.txt编码为UTF-8。
输出文本为UTF-8。
*/
#包括
#包括
#包括
#定义ZW_空间“\xE2\x80\x8B”
void printUnicodeString(const UnicodeString&s){
int32_t leng=s.length()*U8_MAX_length+1;
char*charBuf=新字符[len];
len=s.extract(0,s.length(),charBuf,len,NULL);
charBuf[len]=0;
printf(“%s”,charBuf);
删除charBuf;
}
/*创建和使用文本边界*/
int main(int argc,字符**argv)
{
ucnv_setDefaultName(“UTF-8”);
单程行车检查(“Aaa bbb ccc.Ddd eee fff”);
printf(“检查:”);
如果(argc>1){
//覆盖默认的字符集。
stringToExamine=UnicodeString(argv[1]);
if(stringToExamine.charAt(0)=0xFEFF){
//删除BOM表
stringToExamine=UnicodeString(stringToExamine,1);
}
}
打印(stringToExamine);
认沽权(“”);
//按正反顺序打印每个句子
UErrorCode状态=零错误;
BreakIterator*boundary=BreakIterator::createWordInstance(空,状态);
如果(U_故障(状态)){
printf(“未能创建分句迭代器。状态=%s”,
u_errorName(状态));
出口(1);
}
printf(“结果:”);
//按顺序打印每个单词
边界->设置文本(stringToExamine);
int32_t start=boundary->first();
int32_t end=boundary->next();
while(end!=BreakIterator::DONE){
如果(开始!=0){
printf(ZW_空间);
}
printUnicodeString(UnicodeString(stringToExamine,start,end start));
开始=结束;
结束=边界->下一步();
}
删除边界;
返回0;
}
非常感谢!
-Nathan

参数列表太长错误消息来自bash shell,并且在代码开始执行之前发生

唯一可以修复以消除此问题的代码是bash源代码(或者它可能在内核中),然后,您总是会遇到限制。如果您将命令行上的2048个文件增加到10000个,那么有朝一日您将需要处理10001个文件;-)

管理“太大”的参数列表有很多解决方案

标准化的解决方案是xargs实用程序

 find / -print | xargs echo 
这是一个没有帮助但有效的例子

有关更多信息,请参阅

甚至xargs也有问题,因为文件名可能包含空格、新行字符和其他不友好的内容


我希望这有帮助。

下面的代码读取一个文件的内容,该文件的名称作为命令行上的第一个参数,并将其放置在
str::buffer
中。然后,不要用argv[1]调用函数
UnicodeString
,而是使用该缓冲区

#include<iostream>
#include<fstream>

using namespace std;

int main(int argc, char **argv)
{
    std::string buffer;

    if(argc > 1) {
        std::ifstream t;
        t.open(argv[1]);
        std::string line;
        while(t){
            std::getline(t, line);
            buffer += line + '\n';
        }
    }
    cout << buffer;
    return 0;
}

啊,是的,这很有帮助。不,它不是看shell如何处理字断——它只是为生成的文件——你能帮助改变代码逐行读取文本吗?我无意中删除了我的注释:-)从C++中的文件中读取,请参阅发布您的代码,我很乐意帮助您…我想知道它去了哪里:)需要修改以逐行阅读的代码在问题中。我个人不知道C++,原来的代码是由有人帮助我完成ICU提交的,但是他很忙,所以我想我会去别处看看。谢谢你的帮助!再仔细看一下代码——可能您需要stdio.h brkiter.h和ucnv.h的源代码。。。这意味着这可能比我想象的要复杂…我可以把这些信息来源告诉你,但是如果这会占用你太多的时间,不用担心。谢谢弗雷德里克-你能再详细一点吗?我不知所措……对不起!是否用您的代码替换旧代码中的int main函数?我试过了,但是我得到了错误:InsertZWSlarge.cpp:80:5:error:expected unqualified id在'if'之前InsertZWSlarge.cpp:88:5:error:'boundary'没有命名类型InsertZWSlarge.cpp:91:5:error:expected unqualified id在'while'之前,所以我想我做错了……嗨,Fredrik!谢谢你的帮助!对不起,我的经验太有限了,我还是不能让它工作。更新后的代码将替换以前编写的代码,对吗?也许这是与ICU的兼容性问题……但更可能是我的愚蠢:P您能将您的代码与我在问题中发布的代码内联吗?谢谢
#include<iostream>
#include<fstream>

using namespace std;

char * GetFileIntoCharPointer(char *pFile, long &lRet)
{
    FILE * fp = fopen(pFile,"rb");
    if (fp == NULL) return 0;

    fseek(fp, 0, SEEK_END);
    long size = ftell(fp);
    fseek(fp, 0, SEEK_SET);

    char *pData = new char[size + 1];
    lRet = fread(pData, sizeof(char), size, fp);

    fclose(fp);

    return pData;
}

int main(int argc, char **argv)
{
    long Len;
    char * Data = GetFileIntoCharPointer(argv[1], Len);
    std::cout << Data << std::endl;

    if (Data != NULL)
        delete [] Data;

    return 0;
}