2015-12-14 2 views
-7

У меня есть два файла, и в одном я создал простой класс:Невозможно создать текстовый файл с помощью 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.

+0

Может быть, небольшой вид, возможно, вам нужно запустить программу как администратора или такого? Может быть, возможность. – Annabelle

+0

Я пробовал все .. не работает .. его странная проблема – Phoenix

+0

try ../txtfile/ для вашего каталога – ForeverStudent

ответ

1

Точка 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 или антиквариат), возможно, не запускает вашу программу там, где вы думаете, что она работает.

Добавьте это в ваш код в основной:

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 может проверить возвращаемое значение, чтобы увидеть, следует ли продолжать или возвращать. Или вы можете сделать исключение.

+0

Я нашел действительно ваше полезное объяснение, но это не ответ на мой вопрос. – Phoenix

+0

@Phoenix. Одна вещь, которую я пропустил, когда пишу, используя perror, чтобы распечатать причину ошибки. [Документация по perror.] (Https://msdn.microsoft.com/en-us/library/9t0e6085.aspx) Вероятно, у вас есть две проблемы и, надеюсь, зная, почему файл не открывается, вам помогут. – user4581301

2

Согласно the reference, ios::in | ios::outstd::ios_base::openmode конфигурации будет генерировать ошибку, если файл не существует, так что вы не создать новый с этим.

Я не знаю, почему вы используете элемент std::fstream, createfile может быть просто функцией static, которая не изменяет никаких объектов. Вы даже закрываете его потом! Это создаст файл с помощью местногоstd::ofstream, открытый режим которого является std::ios_base::out, который будет создать файл:

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

преподаватели преподавали только с использованием пространства имен std; и не используя std методы. std :: cout << "blabla" << endl; // это они не научили нас, я учился один, но я не очень много знаю о std – Phoenix

+0

'fstream' и' string' также поступает из 'std'. – LogicStuff

+0

есть ли какой-нибудь другой сайт, где мы colobrate с C++ – Phoenix

Смежные вопросы