Чтение/запись в бинарный файл С++

227
10 марта 2017, 00:17

Здравствуйте, я реализую свой класс String и создаю свой класс `City.

include <iostream>
#include <string>
#include "String.h"
#include <fstream>
#include <vector>
#define string String 
#define END std::endl

class City
{
private:
    string Name;
    int Ppl;
    double Area;
    int Birth;
    int Schools;    
public:
    City();
    ~City();
    void showInfo();
    void getData();
    void write(char *fileName);
    void read(char *fileName);
};

Мне нужно записать мою информацию в бинарный файл. Для этого я реализую два метода write и read, в которые приходит один аргумент имя файла, так как моя программа работает с аргументами, одним из них я передаю имя файла.

Моя проблема заключается в следующем:

Мои методы используют такие функции, которые не могут работать с моим String. Это с_str, size(). Вы бы не могли мне помочь с реализацией этих функций?

#include "City.h"
#include "String.h"
#include "TCharArray.h"
#include <iostream>
#include <fstream>
#include <io.h>
#include <vector>

City::City() : Name("NoName"), Ppl(0), Area(0.0), Birth(0), Schools(0)
{}
City::~City()
{
}
void City::showInfo() {
    std::cout << "Name\t\t" << "People\t\t" << "Area\t\t" << "Birth\t\t" << "Schools\t\t" << END;
    std::cout <<""<<Name<<"\t\t" << Ppl<<"\t\t" << Area<<"\t\t" << Birth<<"\t\t" << Schools<< END;
}
void City::getData()
{
        std::cout << "Enter a name of the city:   ";
        (std::cin >> Name).get();
        std::cout << "Enter quanity of people in the city:   ";
        std::cin >> Ppl;
        std::cout << "Enter area of the city:   ";
        std::cin >> Area;
        std::cout << "Enter a year of foundation of the city:   ";
        std::cin >> Birth;
        std::cout << "Enter quanity of schools in the city:   ";
        std::cin >> Schools;
}

void write(char *fileName)
{
    std::vector<string>words;
    std::fstream tab(fileName, std::ios::binary | std::ios::out);
    for (size_t i = 0; i < words.size(); i++)// size() не может работать с моим String
    {
        size_t size = words[i].size();// size() не может работать с моим String
        // пишем в файл длину строки: 
        tab.write((char *)&size, sizeof(size));
        // теперь саму строку: 
        tab.write(words[i].c_str(), size);// с_str не может работать с моим String
    }
    tab.close();
}
void read(char *fileName)
{
    std::vector<string>words;
    std::fstream show(fileName, std::ios::binary | std::ios::in);
    for (size_t i = 0; i < words.size(); i++)// size() не может работать с моим String
    {
         size_t size;
        // читаем длину очередной строки:
        show.read((char *)&size, sizeof(size));
        // читаем саму строку:
        char buf[size + 1];
        show.read(buf, size);
        buf[size] = 0;
    }
    show.close();
}
Answer 1

Ну у вас используется

vector<string> words -> words.size() == 0

А реализация обычная

size_t size() const noexcept
{
   return len;
}
const char* c_str() const noexcept
{
   return data;
}

ссылка на свою реализацию string (если надо): https://github.com/leprik0n/str

READ ALSO
Память в DLL и вне ее

Память в DLL и вне ее

В связи с этим вопросом

217
scanf %p и касты указателей

scanf %p и касты указателей

http://codepadorg/WD1oWXL8

197
gtkmm + cmake (windows)

gtkmm + cmake (windows)

Приветствую дамы и господаНе могу автоматически "зацепить" директорию gtkmm с помощью CMake

189
Ошибка памяти C++

Ошибка памяти C++

Выходит ошибка при заполнении A[2][1] те

204