1

私は C++ にはまったく慣れていませんが、R 言語でのコーディングには慣れています。数週間前に、ファイル ペア (.seq/.ab1) をコピーして名前を変更する小さなアプリケーションの作成を開始しました。DNA シーケンサー分析の結果 (何百もの名前を手動で変更するのは、特に新しい名前のリストがあるため、リアルタイムの無駄になります)。

すべて問題ないように見えましたが、新しいファイル (コピーされたもの) の名前 (ファイル タイプの直前) に「特殊文字」が含まれて表示され、スペースのように見えますが、そうではありません (スペースに置き換えました)。 、ファイルが正しく開かれている)。ファイルを削除した後、関連するアプリケーションでファイルを開くことができますが、アプリケーションはファイルが破損していると主張します。

問題は ostringstream::str メンバー関数に関連するコードにあるようですが、正直、修正方法がわかりません。ファイルタイプを追加する前に、そこにヌル文字を挿入していないのだろうか...

これが責任のあるコードの部分です。「;」で区切られた 2 列の csv ファイルから古い名前と新しい名前を取得します。元のデータと新しい (名前が変更されたファイル) データは異なるディレクトリに保持されるため、for ループ内で各ファイル パスを含む文字列を作成する必要があります。おそらくmemcmpを使用して、後で古いファイルと新しいファイルの内容を確認するつもりです。しかし、最初にそれらの名前を正しく変更する必要があります。

私は、gcc 4.8.4 をコンパイラとして使用している Ubuntu 14.04 (64 ビット) マシンを使用しています。私はおそらく下手なコーディングと下手な英語をすでに言い訳しています。私はネイティブスピーカーではありません(実際にはライターです)。

    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();
4

2 に答える 2

1

リストファイルは Windows マシン上に用意されていますか? その場合、DOS 行末 ( \r\n) になり、Unix の getline にはあまり適していません。あなたが見る文字は、おそらく\rです。dos2unixリストファイルをプログラムに供給する前に、必ずユーティリティを使用してください

于 2015-12-22T17:20:34.603 に答える
0

から返された値をトリミングするのを忘れてgetlineいる可能性があるため、空白が含まれている可能性があります。空白は、アプリケーションで検出するのが難しい場合があります。

于 2015-12-22T14:06:28.497 に答える