Как использовать индикатор длины в программе на C ++ - PullRequest
1 голос
/ 24 апреля 2010

Я хочу создать программу на C ++, которая будет читать файл, в котором перед каждым полем будет стоять номер, указывающий его длину.

Проблема в том, что я читаю каждую запись в объекте класса; как сделать атрибуты класса динамическими?

Например, если поле "john", оно будет считано в массив из 4 символов.

Я не хочу создавать массив из 1000 элементов, так как минимальное использование памяти очень важно.

Ответы [ 4 ]

3 голосов
/ 24 апреля 2010

Используйте std::string, размер которого будет достаточно большим, чтобы вместить содержимое, назначенное вам.

2 голосов
/ 24 апреля 2010

Если вы просто хотите прочитать слово в слово из файла, вы можете сделать:

vector<string> words;
ifstream fin("words.txt");
string s;
while( fin >> s ) {
    words.push_back(s);
}

Это поместит все слова в файле в вектор words, но вы потеряете пробел.

1 голос
/ 24 апреля 2010

Для этого вам необходимо использовать динамическое распределение (прямо или косвенно).

Если напрямую, вам нужно new[] и delete[]:

char *buffer = new char[length + 1];   // +1 if you want a terminating NUL byte

// and later
delete[] buffer;

Если вам разрешено использовать повышение, вы можете немного упростить это, используя boost::shared_array<>.С помощью shared_array вам не нужно вручную удалять память, поскольку обертка массива позаботится об этом за вас:

boost::shared_array<char> buffer(new char[length + 1]);

Наконец, вы можете выполнять динамическое распределение косвенно с помощью таких классов, как std::string илиstd::vector<char>.

1 голос
/ 24 апреля 2010

Полагаю, между записями нет пробелов, или вы просто пишете file >> record в цикле.

size_t cnt;
while ( in >> cnt ) { // parse number, needs not be followed by whitespace
    string data( cnt, 0 ); // perform just one malloc
    in.get( data[0], cnt ); // typically perform just one memcpy
    // do something with data
}
...