Страницы

Поиск по вопросам

четверг, 13 февраля 2020 г.

Баг в коде. c++. ifstream

#cpp


Почему этот код падает с Segmentation fault?

#include 
#include 

void func(std::ifstream &f, std::string &key_len_str) {
    char *c;
    f.read(c, 1);
    key_len_str += (std::string) c;
}

int main() {
    std::ifstream f("f.txt", std::ios_base::binary);
    std::string s = "";
    func(f, s);
    func(f, s);
    func(f, s);
    std::cout << s << std::endl;
}

    


Ответы

Ответ 1



Рекомендую вам полностью переписать код. Так как вы получаете только 1 символ, было бы логичнее использовать функцию get. Вы передаёте строку key_len_str с типом string, который является контейнером, состоящим из элементов char, в него можно положить объект типа char с помощью метода push_back. Я исправил ваш код с учётом рекомендаций: #include #include #include void func(std::ifstream &f, std::string &key_len_str) { char c; f.get(c); key_len_str.push_back(c); } int main() { std::ifstream f("f.txt", std::ios_base::binary); std::string s = ""; func(f, s); func(f, s); func(f, s); std::cout << s << std::endl; }

Ответ 2



бага здесь char *c; f.read(c, 1); Вы создаете указатель на переменную типа char, но память не выделяете. Как исправить. Хороший вариант char c; f.read(&c, 1); Похуже, сильно похуже (вариант не рекомендуется к употреблению в реальных программах, кроме случая, если это нужно для обезумевшего преподавателя). char * c = new char; f.read(&c,1); delete c;

Комментариев нет:

Отправить комментарий