首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++ -损坏字符串

C++ -损坏字符串
EN

Stack Overflow用户
提问于 2015-12-22 13:02:40
回答 2查看 1.1K关注 0票数 1

我对C++非常陌生,但我习惯于使用R语言编写代码。几周前,我开始构建一个小应用程序,它应该复制和重命名文件对(..seq/.ab1)。DNA测序器分析的结果(手动重命名数百个将是一种实时的浪费,特别是因为我们有新名字的列表)。

一切似乎都很好,但是新文件(复制的文件)的名字中出现了一个“特殊字符”(就在文件类型之前),它看起来像空格,但它不是(我用空格替换了它,文件正确打开)。删除该文件后,它的相关应用程序可以对其进行操作,但使用该应用程序,应用程序会增加要损坏的文件。

这个问题似乎来自于与ostringstream流::str成员函数相关的代码,但老实说,我不知道如何修复它。在添加文件类型之前,我想知道它是否没有插入空字符.

这是代码中负责的部分。它从一个由";“分隔的2列csv文件中获取新旧名称。原始数据和新的(重命名的文件)数据保存在不同的目录中,这就是我需要在for循环中创建一个包含每个文件路径的字符串的原因。我打算稍后检查旧的和新的文件内容,可能使用memcmp。但首先,我需要正确地重新命名它们。

我在Ubuntu14.04 (64位)机器上,gcc 4.8.4作为编译器。我已经原谅自己的编程能力很差,英语也不太好,我不是以英语为母语的人(实际上是作家)。

代码语言:javascript
复制
    fNew.open(filename);
    std::ostringstream oldSeqName (std::ostringstream::ate);
    std::ostringstream newSeqName (std::ostringstream::ate);
    std::ostringstream oldAb1Name (std::ostringstream::ate);
    std::ostringstream newAb1Name (std::ostringstream::ate);

    std::fstream log;
    time_t now = time(0);

    for (std::string nOld, nNew; getline(fNew, nOld, ';') && getline(fNew, nNew); )
    {
        std::cout << "Old Name: " << nOld << " -> New Name: " << nNew << std::endl;

        // Keep a log of the name changes
        log.open("NameChangesLog.txt", std::fstream::out | std::fstream::app);
        log << ctime(&now) << " - " <<  "Old Name: " << nOld << " -> New Name: " << nNew << std::endl;
        log.close();

        // Create old seq files paths string
        oldSeqName.str(nOld);
        oldSeqName << ".seq";
        std::string osn = "./Seq/" + oldSeqName.str();

        // Create new seq files paths string
        newSeqName.str(nNew);
        newSeqName << ".seq";
        std::string nsn = "./renamed/" + newSeqName.str();

        std::ifstream ifseq(osn, std::ios::binary);
        std::ofstream ofseq(nsn, std::ios::binary);

        ofseq << ifseq.rdbuf();

        ifseq.close();
        ofseq.close();

        // Create old ab1 files paths string
        oldAb1Name.str(nOld);
        oldAb1Name << ".ab1";
        std::string oan = "./Seq/" + oldAb1Name.str();

        // Create new abq files paths string
        newAb1Name.str(nNew);
        newAb1Name << ".ab1";
        std::string nan = "./renamed/" + newAb1Name.str();

        std::ifstream ifab1(oan, std::ios::binary);
        std::ofstream ofab1(nan, std::ios::binary);

        ofab1 << ifab1.rdbuf();

        ifab1.close();
        ofab1.close();

    }

    fNew.close();
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-12-22 17:20:34

列表文件在Windows机器上准备好了吗?在这种情况下,它将有DOS行结束(\r\n),不太适合在Unix上的getline。你看到的字符很可能是\r。在将列表文件输入程序之前,请确保使用dos2unix实用程序。

票数 1
EN

Stack Overflow用户

发布于 2015-12-22 14:06:28

您可能忘记了trimgetline返回的值,因此它们可能仍然包含空格。应用程序可能很难获取空白空间。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34416554

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档