【问题标题】:How to create a text file in subdirectory? [duplicate]如何在子目录中创建文本文件? [复制]
【发布时间】:2020-01-06 11:01:58
【问题描述】:

我需要在程序的子目录中创建一个文本文件来写入一些数据。下面的行不起作用,文件夹没有创建。即使我手动创建子文件夹,也不会创建该文件。如果没有子文件夹,此命令可以完美运行。

FILE* f;
if (fopen_s(&f, "/Sandbox/OUTPUT.txt", "w"))
   return 1; // Nothing happens
if (fopen_s(&f, "//Sandbox//OUTPUT.txt", "w"))
   return 1; // Nothing happens
if (fopen_s(&f, "\\Sandbox\\OUTPUT.txt", "w"))
   return 1; // Nothing happens
if (fopen_s(&f, "\Sandbox\OUTPUT.txt", "w"))
   return 1; // Nothing happens
if (fopen_s(&f, "Sandbox/OUTPUT.txt", "w"))
   return 1; // Nothing happens
if (fopen_s(&f, "Sandbox\OUTPUT.txt", "w"))
   return 1; // Creates a file named 'SandboxOUTPUT.txt'

如何正确编码?

【问题讨论】:

  • 您确定要询问 C++ 而不是 C?
  • Windows 中的绝对路径中不需要包含驱动器号吗?

标签: c++ text-files fopen


【解决方案1】:

如果您有启用 C++17 的编译器,请使用 std::filesystem。下面是一些你可以用它做的事情的介绍,应该是不言自明的,但如果有任何不清楚的地方,请询问,我会尽力澄清。

#include <filesystem>
#include <fstream>
#include <iostream>

namespace fs = std::filesystem;

int main() {
    // create a path in an OS agnostic manner
    fs::path dir_path = fs::path(".") / "Sandbox";
    fs::directory_entry dir(dir_path);

    if(dir.exists()) {
        std::cout << dir << " already exists\n";
        if(dir.is_directory() == false) {
            std::cerr << "... but is not a directory\n";
            return 1;
        }
    } else {
        std::cout << "creating dir  " << dir << "\n";
        if(fs::create_directory(dir) == false) {
            std::cerr << "failed creating " << dir << "\n";
            return 1;
        }
    }
    {
        // create a path to your file:
        fs::path filename = dir_path / "OUTPUT.txt";
        std::cout << "creating file " << filename << "\n";

        std::ofstream os(filename);
        if(os)
            os << "Hello world.\n";
        else {
            std::cerr << "failed opening " << filename << " for writing\n";
            return 1;
        }
    }
}

【讨论】:

    【解决方案2】:

    我想你是在 Windows 环境中工作的。

    如果Sandbox 文件夹是当前目录的子目录,则应使用"Sandbox\\OUTPUT.txt"".\\Sandbox\\OUTPUT.txt"
    如果是驱动器根目录下的文件夹,则使用"C:\\Sandbox\\OUTPUT.txt"

    换句话说,一个反斜杠需要通过另一个反斜杠进行转义。

    如果你想先创建目录,那么试试:

    mkdir(".\\Sandbox")mkdir("C:\\Sandbox")

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多