我正在阅读文本文件中写入的文件名中的字符串向量。对于每个文件名,我想创建其完整的路径,以便可以阅读它。对于最终路径,我使用sprintf函数将" map_path"one_answers"文件名"变量合并到文件名(char数组)中。
现在,在Windows上的显示文件名中包含"/data2/worcester_000187.txt",这是我所需要的。但是在Ubuntu Server上运行它给出了结果" .txta2/worcester_000187",它部分覆盖了数据2。文本文件包含这样的文件名,即每行上的单个名称:
worcester_000187
worcester_000192
worcester_000193
worcester_000194
worcester_000196
worcester_000197
worcester_000198
我发现,如果我分配"文件名"字符串变量,带有硬编码值说:
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' array中覆盖了前四个字符。我希望这是有道理的。
使用 dos2unix 命令将文本文件转换为所需的格式。