fstream无法创建新文件

3

我正在尝试学习动态文件访问。以下是我的代码:

int main()
{
    dtbrec xrec; // class object
    fstream flh;

    // Doesn't create a new file unless ios::trunc is also given.
    flh.open("database.txt", ios::in | ios::out | ios::binary);

    flh.seekp(0,ios::end);
    xrec.getdata();
    flh.write((char*)&xrec, sizeof(dtbrec));

    flh.close();
}

我认为默认情况下,fstream会在文件不存在时创建一个新文件'database.txt'。有什么想法可以解决这个问题吗?

1
欢迎来到Stack Overflow!这个问题之前已经被问过了:https://dev59.com/HMgvz4gBFxS5KdRjGbKR?rq=1 - Thom Wiggers
@ThomWiggers 哇,谢谢你。但是如果没有指定 ios::in,那么数据会如何存储在文件中呢? - Stephen Jacob
@AlexandruBarbarosie 谢谢,我知道如何使用 ifstream 和 outstream,但是我想使用 fstream。 - Stephen Jacob
3个回答

21

关于 fstream 的一些要点:

a. 如果你使用反斜杠指定目录,例如:

fstream f;

f.open("folder\file", ios::out);

它将无法正常工作,反斜杠必须在前面加上一个反斜杠,所以正确的做法是:

f.open("folder\\file", ios::out);

b. 如果你想创建一个新文件,这样做将不起作用:

f.open("file.txt", ios::in | ios::out | ios::binary);

正确的做法是先创建文件,使用ios::out或ios::trunc之一:

f.open("file.txt". ios::out) 或 f.open("file.txt", ios::trunc);

然后才能执行:

f.open("file.txt", ios::in | ios::out | ios::binary);

c.最后,可以按照这个答案中指定的顺序进行操作:fstream not creating file

基本上,ios::in 要求已经存在一个文件。


1
你的示例显示正斜杠而不是反斜杠。你不需要转义正斜杠。 - Buge
谢谢Buge,我已经编辑过了。在学习fstream时,我使用反斜杠。虽然我现在知道并主要使用正斜杠,但我不想编辑内容(使用反斜杠),因为我个人认为最初在学习fstream时,这篇文章可能对新手有用,但是你的评论也会对他们有帮助。 - Stephen Jacob

4

尝试使用 ofstream,它会自动创建文件(如果该文件不存在)。或者,如果您想在流上进行输入和输出,请尝试使用fstream,但您不需要指定ios::in|ios::out|ios::binary,因为fstream会自动为您设置。


1
除了Stephen Jacob所说的,我发现在Windows上需要执行以下操作才能生成文件:
f.open("file.txt", fstream::trunc | fstream::out);
仅执行trunc是不起作用的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接