c ++如何将命令行参数的路径放入fprintf

c++ How to put path from command line argument to fprintf

我无法弄清楚如何从命令行参数获取路径并让我的程序使用 fprinf 写入该文件夹。例如:/here 会将文件写入“here”文件夹,/here 是程序所在位置到需要写入位置的路径。如果路径是 /there/here,则相同。这只是我的代码的这一部分:

    void write_file(int sockfd, char* path)
    {
       int n;
       FILE *fp;
       char filename[] = "file1.txt";
       char buffer[SIZE];

       fp = fopen(filename, "w");
       if (fp == NULL)
       {
          std::cerr << "ERROR: Could not write file.\n";
          exit(EXIT_FAILURE);
       }
       while (1)
       {
          n = recv(sockfd, buffer, SIZE, 0);
          if (n <= 0)
          {
             break;
             return;
          }
          fprintf(fp, "%s", buffer);
          bzero(buffer, SIZE);
       }
       fclose(fp);
       return;
    }

此代码有效,但会将文件保存在我当前的文件夹中。变量“路径”是命令行参数。

编辑:这是不将行打印到文件的代码。相反,它从现有文件复制行并将这些行放入“file1.txt”文件。

这是一个使用 std::filesystem (C++17) 的例子:

void write_file(int sockfd, const char* path)
{
    auto filename = std::filesystem::path(path) / "file1.txt";
    std::ofstream out{ filename, ios::trunc | ios::out };
    if (!out) {
        std::cerr << "ERROR: " << std::strerror(errno) << "\n";
        exit(EXIT_FAILURE);
    }
    char buffer[SIZE];
    while (1)
    {
        int n = recv(sockfd, buffer, sizeof(buffer), 0);
        if (n == 0)
        {
            break;
        }
        if (n < 0) {
            std::cerr << "ERROR: " << std::strerror(errno) << "\n";
            break;
        }
        if (!out.write(buffer, n)) {
            std::cerr << "ERROR: " << std::strerror(errno) << "\n";
            break;
        }
    }
}

如果您没有 std::filesystem 支持,您可以用一些手动路径连接替换前 2 个语句,例如:

    std::string filename = path;
    if (filename != "" && filename.back() != '/')
        filename += '/';
    filename += "file1.txt";