【问题标题】:c++ How to put path from command line argument to fprintfc ++如何将命令行参数的路径放入fprintf
【发布时间】:2021-06-15 01:00:57
【问题描述】:

我无法弄清楚如何从命令行参数获取路径并让我的程序使用 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;
    }

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

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

【问题讨论】:

  • 你知道snprintf吗?您可以使用它来构造包含多个值的字符串,就像其他两个格式化为 %s/%s 的字符串一样。
  • 另外,fprintf(fp, "%s", buffer); 有点危险...您确定 buffer 中的内容将是一个null 终止字符串?
  • @Someprogrammerdude 我将如何使用 snprintf,因为它不接受打开的文件作为参数
  • 有人理解这个问题吗?我认为问题不在于使用frprintf,而是了解不同路径/目录:可执行文件、运行位置和绝对相对路径的影响。
  • 而且很可能缺少终止零是一个问题。

标签: c++ file path format printf


【解决方案1】:

这是一个使用 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";

【讨论】:

  • 我让它使用非 std::filesystem 版本工作。非常感谢!
  • 事实证明,我的 FILE* fp 正在将文件完美地传输到我们眼前,但正在改变幕后的事情。因此,我不得不将其更改为使用 ofstream,而您的代码确实帮助我弄清楚了如何使用它并将其用于我需要的目的。非常感谢!
猜你喜欢
  • 1970-01-01
  • 2014-02-15
  • 1970-01-01
  • 2014-04-12
  • 2012-10-21
  • 2014-11-27
  • 2012-04-13
  • 1970-01-01
  • 2013-06-03
相关资源
最近更新 更多