#c #raspberry-pi3 #fstream
#c #raspberry-pi3 #fstream
Вопрос:
Я пытаюсь запустить программу cpp на raspberry pi 3 b (от пользователя ‘pi’), но когда я пытаюсь открыть файл с помощью библиотеки ‘fstream’, это не работает. Я использую следующий код (из main):
std::ios::sync_with_stdio(false);
std::string path = "/NbData";
std::ofstream nbData(path);
if (!nbData) {
std::cout << "Error during process...";
return 0;
}
nbData.seekp(std::ios::beg);
Там программа всегда терпит неудачу и останавливается, потому что файл не создан (я не получаю неустранимую ошибку, но тест завершается неудачей, и он выдает «Ошибка во время процесса», что означает, что файл не был создан).
Я выполняю компиляцию с помощью следующей команды (при компиляции проблем нет):
g -std=c 0x nbFinder.cpp -o nbFinder
Я уже пробовал свою программу на Xcode, и все работало отлично…
Комментарии:
1. Вы проверили права доступа к файлам? Можете ли вы создать файл в этом каталоге, например, используя «touch»? (т. Е. без вашего кода, просто с вашими обычными разрешениями)
2. Да, я могу, потому что я использую ‘pi’, у которого есть все разрешения
3. передача path.c_str() не работает
4. @Ian, начиная с c 11, существует конструктор, принимающий std::string .
5. @Seth, ты уверен, что у pi есть все разрешения? Обычная настройка заключается в использовании пользователя без всех разрешений и получении их только при необходимости с помощью
sudo
.
Ответ №1:
Проблема в вашем path. Вы должны поместить файл, вы используете только путь, и если путь не существует, будет выдана ошибка. В вашем случае вы просто используете std::string path = "/NbData";
, то есть ваш путь, а не ваш файл. Чтобы иметь возможность открыть ваш файл, вам нужно убедиться, что ваш путь существует. Попробуйте использовать приведенный ниже код, он проверит, существует ли путь, если он не будет создан, а затем попытается открыть ваш файл.
#include <iostream>
#include <fstream>
#include <sys/types.h>
#include <sys/stat.h>
int main() {
std::ios::sync_with_stdio(false);
std::string path = "./test_dir/";
std::string file = "test.txt";
// Will check if thie file exist, if not will creat
struct stat info;
if (stat(path.c_str(), amp;info) != 0) {
std::cout << "cannot access " << path << std::endl;
system(("mkdir " path).c_str());
} else if(info.st_mode amp; S_IFDIR) {
std::cout << "is a directory" << path << std::endl;
} else {
std::cout << "is no directory" << path << std::endl;
system(("mkdir " path).c_str());
}
std::ofstream nbData(path file);
if (!nbData) {
std::cout << "Error during process...";
return 0;
}
nbData.seekp(std::ios::beg);
return 0;
}