在C++中的特定路径中写入文件

use*_*718 9 c++ file filepath

我有这个代码成功写入一个文件:

    ofstream outfile (path);
    outfile.write(buffer,size);
    outfile.flush();
    outfile.close();
Run Code Online (Sandbox Code Playgroud)

缓冲区和大小在其余代码中都可以.如何将文件放在特定路径中?

111*_*111 12

在流的构造函数中指定完整路径,这可以是绝对路径或相对路径.(相对于程序运行的位置.

流析构函数为您关闭文件,显式关闭更有可能引入错误(在文件关闭后写入).

#include <fstream>
#include <string>

int main()
{
    const char *path="/home/user/file.txt";
    std::ofstream file(path); //open in constructor
    std::string data("data to write to file");
    file << data;
}//file destructor
Run Code Online (Sandbox Code Playgroud)

请注意,您可以在C++ 11的文件构造函数中使用std :: string,并且在大多数情况下优先使用const char*.

  • @ThomasMatthews这是真的,我建议仍然按照你推荐的方式使用一个字符串,但是我试图表明ofstream采用了一个`const char*`(可以用你显示的方式获得). (4认同)

use*_*976 5

发布另一个答案的理由

我发帖是因为其他答案都没有涵盖问题空间.

您的问题的答案取决于您如何获得路径.如果您要在应用程序中完全构建路径,请查看@James Kanze的答案.但是,如果您正在从运行程序的环境中读取路径的路径或组件(例如环境变量,命令行,配置文件等),那么解决方案就不同了.为了理解原因,我们需要定义路径是什么.

快速浏览路径

在操作系统上(我知道),路径是一个符合操作系统和文件系统(简称系统)指定的迷你语言的字符串.可以将路径提供给给定系统上的IO功能,以便访问某些资源.例如,以下是您在Windows上可能遇到的一些路径:

\file.txt
\\bob\admin$\file.txt
C:..\file.txt
\\?\C:\file.txt
.././file.txt
\\.\PhysicalDisk1\bob.txt
\\;WebDavRedirector\bob.com\xyz
C:\PROGRA~1\bob.txt
.\A:B
Run Code Online (Sandbox Code Playgroud)

通过路径操作解决问题

想象一下以下场景:您的程序支持命令行参数,--output-path=<path>它允许用户提供程序应该创建输出文件的路径.在指定目录中创建文件的解决方案是:

  1. 根据您正在操作的系统的迷你语言解析用户指定的路径.
  2. 使用迷你语言构建一个新路径,该路径使用您在步骤1中解析的文件名和信息指定写入文件的正确位置.
  3. 使用步骤2中生成的路径打开文件.

这样做的一个例子:

在Linux上,假设用户已指定 --output-path=/dir1/dir2

解析这个迷你语言:

/dir1/dir2
--> "/" root
--> "dir1" directory under root
--> "/" path seperator
--> "dir2" directory under dir1
Run Code Online (Sandbox Code Playgroud)

然后,当我们想要在指定目录中输出文件时,我们构建一个新路径.例如,如果我们要输出一个名为的文件bob.txt,我们可以构建以下路径:

/dir1/dir2/bob.txt
--> "/" root
--> "dir1" directory under root
--> "/" path separator
--> "dir2" directory under dir1
--> "/" path seperator
--> "bob.txt" file in directory dir2
Run Code Online (Sandbox Code Playgroud)

然后我们可以使用这个新路径来创建文件.

通常,不可能完全实现该解决方案.即使您可以编写可以成功解码现有所有路径迷你语言的代码并正确表示每个系统的信息,以便可以正确构建新路径 - 将来您的程序可以在新系统上构建或运行您的程序无法处理的新路径迷你语言.因此,我们需要使用谨慎的策略来管理路径.

路径处理策略

1.完全避免路径操纵

不要尝试操纵输入到程序的路径.您应该将这些字符串直接传递给可以正确处理它们的api函数.这意味着您需要直接使用OS特定的API来避免C++文件IO抽象(或者您需要绝对确定如何在每个OS上实现这些抽象).确保仔细设计程序的界面,以避免可能被迫操纵路径的情况.尝试为您的程序实现算法,同样避免操纵路径的需要.将程序在每个操作系统上使用的api函数记录给用户 - 这是因为OS api函数本身会随着时间的推移而被弃用,因此将来程序可能与所有可能的路径不兼容,即使您小心避免路径操作也是如此.

2.记录程序用于操作路径的函数

准确地向用户记录如何操纵路径.然后明确指出,用户有责任指定可与记录的程序行为一起正常工作的路径.

3.仅支持一组受限制的路径

限制程序将接受的路径迷你语言,直到您确信可以正确操作满足此一组限制的路径子集.将此文件记录给用户.如果输入的路径不符合则会出错.

4.忽略这些问题

做一些基本的路径操作而不用担心太多.接受您的程序将对输入的某些路径显示未定义的行为.您可以向用户说明程序在输入路径时可能会或可能不会正常工作,并且用户负责任地确保程序正确处理了输入路径.但是,您也可以不记录任何内容.用户通常会期望您的程序无法正确处理某些路径(很多都没有),因此即使没有文档也能很好地处理.

结束思想

在项目的生命周期早期确定有效的策略来决定是非常重要的.如果您必须更改以后处理路径的方式,则可能很难避免可能会破坏现有用户程序的行为更改.