来自Sprintf的弦乐的结果与在Ubuntu Server上传递的参数ODER具有不同的值顺序



我正在阅读文本文件中写入的文件名中的字符串向量。对于每个文件名,我想创建其完整的路径,以便可以阅读它。对于最终路径,我使用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
}

,如文本文件所述。这是发生的事情。

  1. Windows写的文本文件(我在Windows中写了文本文件)拿到CR和LF ( r n)作为行结束。
  2. Linux和Unix仅将LF( n)视为线结束。
  3. 在Linux上运行时 getLine()检测 n 以检测线路的末端,并且文件名获取" Worcester_000187 r" 是值。请注意额外的运输返回。
  4. 以下语句 sprintf(fileName,"%s%s.txt",map_path,filename.c_str())可以通过两个步骤进行评估,即我们到达'之前和之后'.txt'

  5. '.txt'文件名包含'/data2/worcester_000187 r'。现在' r'将我们再次开始。

  6. 现在,我们添加 .txt ,而光标正在开始,因此它在'filename' array中覆盖了前四个字符。我希望这是有道理的。

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

最新更新