2015-03-03 5 views
2

Я проверил несколько таких вопросов на SO как: Link 1 и Link 2fstream не создает файл в C++

Но ни один из их ответов не помогает мне. Проведя так много часов в отладке, я не могу обнаружить ошибку. Итак, я спрашиваю его здесь, снова.

Код для моей программы:

#include<iostream> 
#include<fstream> 
#include<string.h> 

using namespace std; 

int main(){ 
    ofstream file; 
    file.open("data.dat",fstream::out); 
    file<<fflush; 
    if(!file) 
     cout<<"error"<<strerror(errorno); 
    file.close(); 
    return 0; 
} 

Это главная основа программы, занимающейся обработкой файлов. Оставшаяся часть программы имеет дело с обработкой некоторых данных и записью ее в файл, который, я думаю, не является ни релевантным, ни тем, что влияет на обработку файлов.

Интересная вещь: программа не мигает никакой ошибкой.

+3

Возможно, файл создан, но не в том месте, где вы его ожидаете? –

+0

Не предполагается ли создание файла в той же папке, в которой существует программа? – Gaurav

+2

Если вы запустите программу из командной строки, файл будет создан в текущем каталоге. Если вы запустите его из среды IDE, то текущий каталог будет установлен в настройках проекта. –

ответ

0
int main(){ 
    ofstream file; 
    file.open("data.dat") // no need to call for ofstream ->fstream::out 
    // file<<fflush; fflush won't work since there is nothing unwriten 
    if(!file.is_open()) // use is_open(); 
     cout<<"error"<<strerror(errorno); 
    // write something to file 
    file << " "; 
    file.close(); 
    return 0; 
} 
+0

'fflush' и' errorno' по-прежнему не соответствуют действительности (см. Комментарии выше) –

+0

Это не касается фактического вопроса и по-прежнему ужасного кода. – jPlatte

+0

if (! File) должен также работать – amchacon

4

Ваш код обычно работает с небольшими изменениями, файл просто создается в текущем рабочем каталоге, из которого программа побежал, а не в директории исполняемым. Есть много других вещей, которые вы могли бы хочу обратиться хотя:

#include <iostream> 
#include <fstream> 
// if including things from the C standard library in a C++ program, 
// use c[header] instead of [header].h; you don't need any here though. 

using namespace std; 

int main() 
{ 
    // no need to call open(), the constructor is overloaded 
    // to directly open a file so this does the same thing 
    ofstream file("data.dat"); 

    if(!file) 
    { 
     cout << "Couldn't open file" << endl; 
     return 1; 
    } 

    file.close(); 

    // return 0; is not needed, your program will automatically 
    // do this when there is no return statement 
} 

для получения более подробной информации о том, почему при открытии файла не работает, вы можете посмотреть на std::basic_ios::bad() и std::basic_ios::fail(). Проверка errno - это то, что вы хотите делать при использовании потоков C++ для обработки файлов.

-2
#include <iostream> 
#include <fstream> 
#include <string.h> 
#include <errno.h> 

int main (int argc, char* argv[]) 
{ 
     std::ofstream file; 
     file.open("data.dat", std::fstream::out); 
     file << "Hello" << std::endl; 

     if (!file) 
       std::cout << "error" << strerror(errno); 
     file.close(); 
     return 0; 
} 

Основные отличия:

  • Вы не #include <errno.h>.
  • можно передать "errorno" в strerror(), а не "ERRNO", который является правильным числом.

Это работает на Ubuntu 14.04 (64-bit). Я скомпилировал с помощью g ++ без флагов.

Кроме того, я предлагаю вам никогда не использовать с использованием пространства имен std; Это может быть очень неприятно, если вы начнете интегрироваться с другими библиотеками, такими как Boost (библиотеки Boost могут перекрываться с каждой стандартной библиотекой C++).

+0

Ну, вы «исправили» предмет пространства имен, но ваша программа так же сломана, как и оригинальная, включить заголовок errno. Вы исправили недостающее значение errno include, но вам не хватает '' для 'std :: fflush' или' 'для' fflush' в глобальном пространстве имен. Я знаю, что это компилируется, но вы полагаетесь на компилятор, включая заголовок, который определяет 'fflush' в пространстве имен' std' как часть одного из других включенных заголовков, и это нехорошо. – jPlatte

+0

Я бы также рекомендовал вам скомпилировать с помощью '-Wall -Wextra -pedantic', он скажет вам, что' файл << std :: fflush' не является хорошей идеей и что нет причин использовать 'int main (int argc, char * argv []) 'вместо' int main() ', если вы не используете аргументы командной строки каким-либо образом. – jPlatte

+0

Кстати, std :: flush определяется в , так что я не понимаю, что в этом плохого? Мне также нравится использовать (int argc, char * argv []), чтобы напомнить себе о стандартной реализации (поэтому я не начинаю лениться и заканчиваю только main()). Также хорошо напомнить себе, что я могу создавать приложения для командной строки, а также обучать других, что это возможно. – Cinch

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