我正在将写入文本文件的文件名读入字符串向量。我想为每个文件名创建其完整路径,以便我可以读取它。对于最终路径,我使用sprintf函数将“ Map_PATH”和“文件名”变量合并到FileName(char数组)中。

现在在Windows上,其显示FileName包含“ /data2/worcester_000187.txt”,这正是我所需要的。但是在Ubuntu服务器上运行它会得到结果“ .txta2 / worcester_000187”,它会部分覆盖data2。文本文件包含类似这样的文件名,即每行一个名称:

worcester_000187
worcester_000192
worcester_000193
worcester_000194
worcester_000196
worcester_000197
worcester_000198


我发现如果我给'filename'字符串变量分配一个硬编码值,就会发现:

filename="worcester_000187";


我得到正确的结果。但是,当相同的文件名变量获取从文本文件读取的字符串值时,就会产生问题。读取文件时存在任何问题。

下面是代码的重点:

char FileName[500];
char Map_PATH[]="/data2/";
vector < string > fileList;
string filename;
fstream fp;

fp.open ("ImagesListTemp.txt", ios::in);
if(!fp.is_open())
{
cerr <<"Unable to open Image Names List: "<<endl;
exit(1);
}


while (getline(fp, filename))
{
fileList.push_back(filename);
}
fp.close();



for(int i=0;i<fileList.size();i++)
{
 filename=fileList[i];
 //    filename="worcester_000187";
 sprintf(FileName,"%s%s.txt",Map_PATH,filename.c_str());
 // Open File and do some operations

}

最佳答案

如预期的那样,问题出在文本文件上。这是发生了什么事。


在Windows中编写的文本文件(我在Windows中编写了文本文件)以CR和LF(\ r \ n)作为行尾。
Linux和Unix仅将LF(\ n)视为行尾。
在Linux上运行时,getline()检测到\ n以检测行尾,并且文件名获取“ worcester_000187 \ r”作为值。注意添加了额外的回车符。
语句sprintf(FileName,“%s%s.txt”,Map_PATH,filename.c_str())可以分两个步骤进行评估,即到达“ .txt”之前和之后
在'.txt'文件名之前包含'/ data2 / worcester_000187 \ r'。现在,“ \ r”将我们带回到该行的开头。
现在,我们添加.txt,光标位于开始位置,因此它将覆盖'FileName'数组中的前四个字符。我希望这是有道理的。


使用dos2unix命令可将文本文件转换为所需的格式。

07-28 03:31
查看更多