我有这段代码可以成功写入文件:
ofstream outfile (path);
outfile.write(buffer,size);
outfile.flush();
outfile.close();
在代码的其他部分,缓冲区和大小都没问题。如何将文件放入特定路径?
在流的构造函数中指定完整路径,可以是绝对路径或相对路径(相对于程序运行的位置)。
流的析构函数会在创建对象的函数结束时为您关闭文件(因为 ofstream
是一个 class
)。
当您想要重复使用同一文件描述符进行另一个文件操作时,显式关闭是一个好的做法。如果不需要这样做,可以让析构函数完成它的工作。
#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*。
std::string::c_str()
获取构造函数或 open
方法所需的 C 语言字符串类型。 - Thomas Matthewsconst char*
(可以通过你展示的方式获得)。 - 111111我发布这篇文章是因为其他答案都没有涵盖此问题。
回答这个问题取决于您如何获取路径。如果您完全在您的应用程序中构建路径,则请参见@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>
,允许用户提供一个路径,在这个路径下创建输出文件。实现在指定目录下创建文件的解决方案如下:
下面是一个例子:
在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
试试这个:
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.
path.as<string>()
函数是什么?我以前从未见过这样的东西。 - jvriesem不太清楚你的问题是什么;如果我理解正确,你有一个文件名,并且想要在特定目录中创建该文件。如果是这种情况,只需在ofstream
的构造函数中指定完整路径即可。您可以使用字符串连接来构建此路径,但我强烈建议使用boost::filesystem::path
。它具有所有可移植性所需的功能,而且还有很多其他功能;否则,您将无法实现可移植性(需要大量努力),即使对文件名进行简单操作也需要考虑很多事情。
ofstream
构造函数或 open()
方法是否会在路径中创建缺失的目录? - hmjdboost::filesystem
的另一个原因是:如果需要,它有一个简单的函数可以完成此操作。 - James Kanze我曾经卡在这里一段时间,但现在已经解决了。路径是基于你的可执行文件所在的位置,并且会有一些变化。以这个例子为例,在你的可执行目录中执行ls
命令,你会看到:
myprogram.out Saves
其中Saves是一个文件夹,myprogram.out是你正在运行的程序。
如果你在代码中将字符转换为c_str()
,可以像这样进行:
string file;
getline(cin, file, '\n');
ifstream thefile;
thefile.open( ("Saves/" + file + ".txt").c_str() );
"Saves/savefile.txt"
这将起作用,以便访问您的“Saves”文件夹中的“savefile.txt”。请注意,没有前置斜杠,您只需从文件夹名称开始。
但是,如果您使用字符串文字,则需要在路径中使用双反斜杠来转义反斜杠。例如:
ifstream thefile;
thefile.open("./Saves/savefile.txt");
要访问相同的文件夹,可以这样做:
"./Saves/savefile.txt"
注意在文件夹名称前面要加上./
。
outfile
的? - hmjd