我对C++非常陌生,但我习惯于使用R语言编写代码。几周前,我开始构建一个小应用程序,它应该复制和重命名文件对(..seq/.ab1)。DNA测序器分析的结果(手动重命名数百个将是一种实时的浪费,特别是因为我们有新名字的列表)。
一切似乎都很好,但是新文件(复制的文件)的名字中出现了一个“特殊字符”(就在文件类型之前),它看起来像空格,但它不是(我用空格替换了它,文件正确打开)。删除该文件后,它的相关应用程序可以对其进行操作,但使用该应用程序,应用程序会增加要损坏的文件。
这个问题似乎来自于与ostringstream流::str成员函数相关的代码,但老实说,我不知道如何修复它。在添加文件类型之前,我想知道它是否没有插入空字符.
这是代码中负责的部分。它从一个由";“分隔的2列csv文件中获取新旧名称。原始数据和新的(重命名的文件)数据保存在不同的目录中,这就是我需要在for循环中创建一个包含每个文件路径的字符串的原因。我打算稍后检查旧的和新的文件内容,可能使用memcmp。但首先,我需要正确地重新命名它们。
我在Ubuntu14.04 (64位)机器上,gcc 4.8.4作为编译器。我已经原谅自己的编程能力很差,英语也不太好,我不是以英语为母语的人(实际上是作家)。
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();发布于 2015-12-22 17:20:34
列表文件在Windows机器上准备好了吗?在这种情况下,它将有DOS行结束(\r\n),不太适合在Unix上的getline。你看到的字符很可能是\r。在将列表文件输入程序之前,请确保使用dos2unix实用程序。
发布于 2015-12-22 14:06:28
您可能忘记了trim从getline返回的值,因此它们可能仍然包含空格。应用程序可能很难获取空白空间。
https://stackoverflow.com/questions/34416554
复制相似问题