我对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();
答案 0 :(得分:1)
是否在Windows机器上准备了列表文件?在这种情况下,它将有DOS行结束(\r\n
),并不适合Unix上的getline。您看到的角色可能是\r
。确保在将列表文件提供给程序之前使用dos2unix
实用程序
答案 1 :(得分:0)
您可能忘记trim从getline
返回的值,因此它们可能仍包含空格。应用程序可以抓住空白区域。