gpt4 book ai didi

c++ - sprintf 生成的字符串的值顺序与 Ubuntu 服务器上传递的参数顺序不同

转载 作者:行者123 更新时间:2023-11-28 07:09:36 25 4
gpt4 key购买 nike

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

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

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' 数组中的前四个字符。我希望这是有道理的。

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

关于c++ - sprintf 生成的字符串的值顺序与 Ubuntu 服务器上传递的参数顺序不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21223720/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com