【问题标题】:Cannot create a txt file using fstream::open无法使用 fstream::open 创建 txt 文件
【发布时间】:2015-12-14 21:27:38
【问题描述】:

我有两个文件,其中一个我创建了简单的类:

#include <iostream>
#include <fstream>
#include <string>
#include <time.h>
#include <stdlib.h>
#include <conio.h>
#include <unistd.h>
class myclass{ 
    protected:
        int ima,imb,imc,tm;
        fstream file;

 public: 
void creafile(string filename){ 
    string dir; 
    dir = "txtfile/"; 
    file.open((dir + filename).c_str(), ios::in | ios::out); 

    if(file.fail()){ 
    //  file.open(filename, ios::in | ios::out); 

      //if(file.fail()) 
      cout<<"Error when creating the file"<<endl; 
      exit(1); 
    } 
file.close(); 
}}

我的主文件名为 data.cpp,只包含以下代码:

using namespace std;
#include "mylib.h"
int main() {
    myclass dat,hi;
    dat.creafile("creatorfile.txt");
    return 0;
}

我的问题是调用creafile时总是出错创建文件时出错。为了做一个更简单的测试用例,我还尝试了以下代码:

file.open("myfile.txt");
    if(!file){ 
      cout<<"Error when creating the file"<<endl; 
      exit(1); 
    } 
file.close();

但是,它仍然给出错误创建文件时出错。我尝试使用所有标志 ios::app ios::in ios::out 等,但没有任何变化。我有 500gb 的可用空间,并且正在运行 Windows 7。

【问题讨论】:

  • 也许是一个小小的疏忽,也许您需要以管理员身份运行程序?有可能。
  • 我什么都试过了..没用..奇怪的问题
  • 为你的目录尝试 ../txtfile/
  • 不,我的 data.cpp 文件在 dir 信息文件夹和我的类文件中。 txtfile文件夹也是

标签: c++ file fstream


【解决方案1】:

根据the referenceios::in | ios::outstd::ios_base::openmode配置如果文件不存在会产生错误,所以你不会用那个创建一个新的。

我不知道你为什么使用成员std::fstreamcreatefile 可能只是一个不会更改任何对象的static 函数。你甚至在之后关闭它!它将使用本地 std::ofstream 创建一个文件,其打开模式为std::ios_base::out创建该文件:

std::ofstream ofs(dir + filename); // .c_str() not needed since C++11

【讨论】:

  • 教师只使用命名空间std;并且不使用标准方法.. std::cout
  • fstreamstring 也来自 std
  • 还有其他网站可以与 c++ 合作
  • 你在问什么?添加一个动词。
  • 哎呀抱歉,如果我已经使用了库 fstream 并声明变量类型文件(fstream 文件;),为什么你使用 std::ofstream ofs?
【解决方案2】:

第 1 点:如果文件不存在,则无法打开读取。幸运的是,您可能不想这样做。同时读取和写入同一个文件是有问题的,而且几乎总是一个坏主意。直到你知道你必须同时读写,

  1. 打开文件进行阅读
  2. 读入文件
  3. 关闭文件。
  4. 编辑内存中的文件
  5. 打开文件进行写入
  6. 写出文件
  7. 关闭文件

如果您的文件非常大,无法存储在内存中,

  1. 打开文件进行阅读
  2. 打开一个临时文件进行写入
  3. 读取部分文件
  4. 编辑您阅读的部分
  5. 将您阅读的部分写入临时
  6. 如果有更多文件,转到 3(但不要使用goto),否则继续
  7. 关闭文件
  8. 关闭临时文件
  9. 删除文件
  10. 将临时文件重命名为文件

第2点:您已经创建了txtfile文件夹,但是您是否在正确的位置创建了它?您的开发环境(包括 conio.h 建议 Visual Studio 或古董)可能不在您认为正在运行的位置运行您的程序。

将此添加到您的 main 代码中:

char buf[4097]; // really big buffer
getcwd(buf, (int)sizeof(buf)); // get working directory
std::cout << buf << std::endl; // print the working directory

如果打印出来的文件夹不是你创建txtfile文件夹的地方,你就不能打开这个文件。如果您想自动制作文件夹,请阅读此处:How to make a folder/directory

第 3 点:exit(1); 是一个非常大的锤子。这是一个讨厌的锤子。 Read more here. 不要在没有非常非常好的理由的情况下使用它。在这种情况下,return 足以让你退出函数,如果你给函数添加返回值,main 可以测试返回值,看看它应该继续还是返回。或者你可以抛出一个异常。

【讨论】:

  • 我发现你的解释真的很有用,但这不是我问题的答案
  • @Phoenix 在写作时我错过了一件事情,那就是使用 perror 打印出错误的原因。 Documentation on perror.您可能有两个问题,希望知道文件未打开的原因会对您有所帮助。
猜你喜欢
相关资源
最近更新 更多
热门标签