【问题标题】:How to append a string to a argv如何将字符串附加到 argv
【发布时间】:2021-09-13 20:02:56
【问题描述】:

我想删除一个文件,该文件的名称作为程序的参数给出;但是,由于文件类型将保持不变(.bat),我希望它由程序自动给出(例如,运行deletefile.exe script 将删除“script.bat”(位于同一目录中))。我已经看到this 的问题,但该解决方案似乎不起作用。

我在这里误解了什么吗?

我的尝试如下:

#include <iostream>
#include <fstream>
#include <string>


using namespace std;

int main(int argc, char *argv[]){

    if(argv[1] == string("del")){
        string file_to_remove;
        file_to_remove = argv[2]+".bat";
        if (remove(file_to_remove.c_str()) != 0){
            cout<<"Error in file deletion.\n";
        }
        else {
            cout<<"Removed alias " << argv[2] << "\n";
        }
    }
    return 0;
}

但这会导致编译器错误

<source>: In function 'int main(int, char**)':
<source>:12:33: error: invalid operands of types 'char*' and 'const char [5]' to binary 'operator+'
   12 |         file_to_remove = argv[2]+".bat";
      |                          ~~~~~~~^~~~~~~
      |                                | |
      |                                | const char [5]
      |                                char*

【问题讨论】:

  • @Ruzihm Ach!我应该寻找副本。啧啧。
  • @AdrianMole 我确实喜欢您在下面的回答 - 如果最终关闭,您会将其复制到另一个问题吗?我也会在那里投票
  • @Ruzihm 实际上,我不完全确定其他问题 是否 重复。不过,这肯定是密切相关的。我没有投票结束,因为那将是一个决定性(锤子)投票。

标签: c++ file iostream


【解决方案1】:

file_to_remove = argv[2]+".bat"; 语句的右侧尝试使用 + 运算符连接两个 char* 字符串;你不能这样做,并且至少必须将其中一个操作数变成std::string

您可以通过构造一个临时的std:string 来做到这一点,如下所示:

file_to_remove = string(argv[2]) + ".bat";

或者,更简洁(C++14 起),将s suffix 添加到字符串文字中:

file_to_remove = argv[2] + ".bat"s;

【讨论】:

  • s 后缀仅在您通过 using 字面量命名空间启用时才有效。
【解决方案2】:

Don’tusing namespace std;

但是,您可以在 CPP 文件(不是 H 文件)或函数内部放置单个 using std::string; 等(参见 SF.7。)


Adrian 之前的回答已经解释说,您对 + 的使用不起作用,因为它还不是 string。但是,您还在没有初始化程序的一行上声明了变量,并在下一行进行了赋值。您应该在声明变量时对其进行初始化。所以,写成这样很简单:

string file_to_remove = argv[2];
file_to_remove = += ".bat";

但是,请注意有一个类型是specifically for file names

std::filesystem::path file_to_remove = argv[2];
file_to_remove.replace_extension (".bat");

这更好,因为它可以感知到已经存在扩展名并对其进行更改,并提供其他形式的文件名操作。

if (remove(file_to_remove.c_str()) != 0){

同样,还有filesystem::remove,它是一个C++函数,接受path对象而不需要产生一个C风格的字符串,如果成功则直接返回true

std::error_code ec;
if (std::filesystem::remove(file_to_remove))  cout << "File removed\n";
else cout << "error was " << ec.message() << "\n";

您可以看到,这也使得获得详细说明实际错误的可读消息变得容易。

【讨论】:

  • @463035818_is_not_a_number 我从另一个答案中粘贴了它,其中每个主题都是一个单独的断点。
  • 看起来好多了 ;)
猜你喜欢
  • 2012-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-24
  • 1970-01-01
相关资源
最近更新 更多