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

时间:2012-03-16 15:20:30

标签: c++ file filepath

我有成功写入文件的代码:

    ofstream outfile (path);
    outfile.write(buffer,size);
    outfile.flush();
    outfile.close();

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

7 个答案:

答案 0 :(得分:11)

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

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

#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

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

答案 1 :(得分: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

通过路径操作解决问题

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

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

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

    解析这种迷你语言:

    /dir1/dir2
    --> "/" root
    --> "dir1" directory under root
    --> "/" path seperator
    --> "dir2" directory under dir1
    

    然后,当我们想要在指定目录中输出文件时,我们构建一个新路径。例如,如果我们要输出名为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
    

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

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

    路径处理策略

    1。完全避免路径操作

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

    2。记录程序用来操作路径的函数

    向用户详细说明如何操纵路径。然后明确指出,用户有责任指定能够正确记录程序行为的路径。

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

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

    4。忽略问题

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

    结束思路

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

答案 2 :(得分:0)

当您打开文件时,需要执行此操作,请参阅std::ofstream constructoropen()成员。

答案 3 :(得分:0)

你要问的不太清楚;如果我理解正确,你就是 给定一个文件名,并且您想要在特定的文件中创建该文件 目录。如果是这种情况,所有必要的是指定 complet ofstream的构造函数的路径。你可以使用字符串 连接以建立这条路径,但我强烈建议 boost::filesystem::path。它具有执行此操作的所有功能 便携,还有更多;否则,你将无法携带(没有 很多努力),甚至对文件名的简单操作也需要 相当的想法。

答案 4 :(得分:0)

我被困在这一段时间并且已经弄明白了。该路径基于您的可执行文件所在的位置并且稍有不同。假设您在可执行文件目录中执行ls,请参阅:

myprogram.out  Saves  

保存是一个文件夹,myprogram.out是您正在运行的程序。

在您的代码中,如果您要以这样的方式将字符转换为c_str()

string file;
getline(cin, file, '\n');
ifstream thefile;
thefile.open( ("Saves/" + file + ".txt").c_str() );

并且用户在savefile中键入,它将是

"Saves/savefile.txt"   

可以在save文件夹中找到savefile.txt。请注意,没有预斜线,您只需从文件夹名称开始。

但是,如果您使用的是字符串文字,如

ifstream thefile;
thefile.open("./Saves/savefile.txt");

这样就可以到达同一个文件夹:

"./Saves/savefile.txt"  

请注意,您从foldername前面的./开始。

答案 5 :(得分:0)

试试这个:

ofstream outfile;
string createFile = "";    
string path="/FULL_PATH";

createFile = path.as<string>() + "/" + "SAMPLE_FILENAME" + ".txt";          
outfile.open(createFile.c_str());       
outfile.close();

//It works like a charm.

答案 6 :(得分:-1)

如果您使用的是linux,请使用mv。

命令尝试execl()