Ofstream пишет пустой файл на Linux - PullRequest
0 голосов
/ 24 мая 2010

У меня есть программа, которая записывает свой вывод, используя ofstream. Все отлично работает в Windows при компиляции с Visual Studio, но записывает пустой файл только в Linux при компиляции с GCC.

ofstream out(path_out_cstr, ofstream::out);
if(out.bad()){
 cout << "Could not write the file" << flush;
}
else{
 cout << "writing";

 out << "Content" << endl;

 if(out.fail()) cout << "writing failed";

 out.flush();
 out.close(); 
}

Каталог, в который выполняется запись, имеет права 0777.

Странная вещь: ничего не написано, но об ошибке не сообщается.

gcc --version: (Gentoo 4.3.4 p1.0, pie-10.1.5) 4.3.4

Я знаю, что код ДОЛЖЕН работать, поэтому мне больше нравится искать предложения, что может быть не так, чем прямое исправление кода.

РЕДАКТИРОВАТЬ: fwrite, похоже, дает сбой точно таким же образом (ничего не записано, не сообщается об ошибке).

РЕДАКТИРОВАТЬ: я представляю и GCC и программу по SSH в моем каталоге университета, если это может иметь какое-либо значение. У меня достаточно разрешений для извлечения и записи файлов (ls.> Out.txt работает нормально), только у моей программы возникли проблемы.

Спасибо за помощь

Ответы [ 4 ]

7 голосов
/ 24 мая 2010

У меня работает, Ubuntu G ++ - 4.1.
Вы пытались выполнить strace ./test и посмотреть, есть ли write() вызовы по файлу?

2 голосов
/ 24 мая 2010

Наиболее вероятным решением является то, что файл не открывается в конструкторе из-за проблемы с именем или путем. Если файл не может быть открыт, будет установлен бит failbit, а не badbit, так что проверьте это вместо использования bad():

ofstream out(path_out_cstr, ofstream::out); 
if(out.fail()){ 
    cout << "Could not write the file" << flush; 
...

fail() проверяет, установлен ли failbit или badbit, тогда как bad только проверяет badbit. Кстати, я попробовал ваш пример, и он не сработал, поэтому я намеренно сделал путь плохим - все еще без проблем, но когда я переключился на fail(), он обнаружил неправильный путь.

1 голос
/ 24 мая 2010

Если файл создается, я вижу причину, по которой он не будет записан.

Проверьте значение path_out_cstr. В Unix-подобных системах пути разделяются косой чертой '/', а не обратной косой чертой в стиле MS-DOS '\', что может объяснить разницу в поведении между двумя операционными системами.


Обновлено

Так как нам не удалось catch, то failbit | badbit проблема на время, вы можете захотеть try подход к обработке исключений ... этот пример остановится после сообщения о первом сбое ...

#include <fstream>
#include <iostream>

int main(int argc, char* argv[])
{
    const char* const path_out = argv[1];

    std::cerr.exceptions(std::cerr.goodbit);

    std::ofstream the_file_stream;
    the_file_stream.exceptions(the_file_stream.badbit | the_file_stream.failbit);

    try
    {
        std::cerr << "Opening [" << path_out << "]" << std::endl;
        the_file_stream.open(path_out);

        std::cerr << "Writing" << std::endl;
        the_file_stream << "Content" << std::endl;

        std::cerr << "Flushing" << std::endl;
        the_file_stream.flush();

        std::cerr << "Closing" << std::endl;
        the_file_stream.close();
    }
    catch (const std::ofstream::failure& e)
    {
        std::cerr << "Failure: " << e.what() << std::endl;
    }

    return 0;
}
0 голосов
/ 24 мая 2010

у меня работает с g ++ 4.4.1

...