无法使用fstream :: open创建txt文件

时间:2015-12-14 21:27:38

标签: c++ file fstream

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

#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。

2 个答案:

答案 0 :(得分:2)

根据the referenceios::in | ios::out std::ios_base::openmode配置会在文件不存在时生成错误,因此您赢了创建新的一个人。

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

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

答案 1 :(得分:1)

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

  1. 打开文件进行阅读
  2. 读入文件
  3. 关闭文件。
  4. 编辑内存中的文件
  5. 打开文件进行编写
  6. 写出文件
  7. 关闭文件
  8. 如果你有一个非常大的文件,你就无法存储在内存中,

    1. 打开文件进行阅读
    2. 打开一个临时文件进行编写
    3. 阅读部分文件
    4. 编辑您阅读的部分
    5. 将您阅读的部分写入临时
    6. 如果有更多文件,请转到3(但不要使用goto),否则继续
    7. 关闭文件
    8. 关闭临时文件
    9. 删除文件
    10. 将临时文件重命名为文件
    11. 第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可以测试返回值以查看它是否应该继续或返回。或者你可以抛出异常。