私は 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();