Fopen Vs ofstream - PullRequest
       2

Fopen Vs ofstream

1 голос
/ 02 сентября 2011

У меня странная проблема, для которой, я думаю, у меня есть обходной путь, но я пытаюсь выполнить анализ первопричин.

Я разрабатывал приложение, которое работает на встроенномверсия Ubuntu 10.04 LTS.Когда приложение запускается, оно считывает файл конфигурации с SD-карты, инициализирует несколько классов, запускает регистратор, который записывает на SD-карту, а затем продолжает свою работу.Во время разработки он работал нормально, когда я запускал его вручную через терминал SSH.

Недавно я экспериментировал с автоматическим запуском приложения при запуске ОС.У меня есть скрипт в init.d, который делает именно это.Тем не менее, я заметил, что сейчас не создаются файлы журналов.Я понял, что проблема не в том, что SD-карта недоступна, потому что файл конфигурации читается правильно при запуске, но выдается ошибка, когда я пытаюсь открыть файл журнала для записи с использованием fopen.

// Open the file
mLogFile = fopen(filename, "wb");
if(mLogFile == NULL)
{
    printf("Error opening Log File [%d].\n", lnRetval);
    return -1; //File couldn't be opened
}

Я предполагал, что это просто проблема с разрешениями, но я не могу понять, почему она не работает, когда я автоматически запускаю программное обеспечение, а не запускаю его вручную в терминале.Кроме того, я не могу понять, почему файл конфигурации читается правильно, но этот файл не может быть открыт.

Единственное отличие, которое я мог видеть, было то, что чтение файла конфигурации было сделано с использованием fstreams, в то время как регистраториспользует C файл ввода / вывода.Поэтому я экспериментировал, поместив следующий код непосредственно перед вызовом fopen выше (/ home / root / etc - это место, где смонтирована SD-карта).

std::ofstream out("/home/root/etc/log/testlog.log");
out << "I can write using fstreams.\n";
out.close();

Это сработало и сгенерировало файл при запуске через init.д.Теперь я полностью в тупике.Почему ofstream работает, а не fopen?Что-то принципиально мне не хватает?

Заранее спасибо.

1 Ответ

2 голосов
/ 02 сентября 2011

Ваш вопрос не дает достаточно информации, чтобы ответить, но общий подход к таким проблемам должен состоять в том, чтобы запустить программу (в обеих формах) под strace и сравнить последовательность сделанных системных вызовов.Это должно быстро показать, что происходит по-другому.Я подозреваю, что вы просто обнаружите, что содержимое filename недействительно ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...