fstream не удается записать / открыть файлы на raspberry pi

#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;
}