Re[3]: Как преобразовать буфер из файла в массив строк?
От: Bell Россия  
Дата: 05.06.02 09:20
Оценка: 3 (1)
Здравствуйте Аноним, Вы писали:


А>Спасибо за ответ!

А>У меня,видимо, какая-то урезанная версия. <vector> там нет :( и
А>push_back пишет left of '.push_back' must have struct/union type
А>(а на объявление std::string strTmp; пишет
А>syntax error : missing ';' before ':') // stdio.h подключен...

Для подключения вектора и всего остального нужно написать:

#include <vector>
#include <string>
#include <fstream>


А>Можно ли сделать то же самое, только в варианте строк типа С? (т.е. массивы символов?)

Можно, но это будет несколько сложнее.
Последовательность действий может быть например такой:
1. Открываем файл:
FILE* fp = fopen("Твой_файл", "r");
2. Сначала пробегается файл, и подсчитывается количество строк.
3. После того, как кол-во строк известно, выделяем место под массив, который будет хранить указатели на добавляеме строки:
char** aStrings = new char* [nNbOfLines];//nNbOfLines — кол-во строк, подсчитанное на пред. этапе.
4. Заполняем массив, читая последовательно строки:
int i = 0;
char buf[1024] = {0};//Чтобы влезла самая длинная строка
char* pStr;
while(fgets(buf, 1023, fp))
{
if(!strlen(buf))
continue;
pStr = new char [strlen(buf) + 1];
strcpy(pStr, buf);
aStrings[i++] = pStr;
}

5. После завершения работы с массивом освободить память:

for(int j = 0; j < nNbOfLines; ++j)
   delete [] aStrings[i];

delete [] aStrings;


И главное — нигде не ошибиться с количеством строк при повторных проходах по файлу.

Согласись, что с помощью STL все получается несколько проще... ;)
Любите книгу — источник знаний (с) М.Горький
Как преобразовать буфер из файла в массив строк?
От: mrgrin  
Дата: 05.06.02 07:14
Оценка:
Недавно занимаюсь С++ и возникла следующая задача, которая не дает двинуться дальше.
Я прочитал текстовый файл в строку char* buffer. Теперь мне хотелось бы, как это можно сделать в Паскале, записать построчно этот буфер в массив. Т.е., чтобы по признаку конца строки записывался новый элемент массива.
Заранее спасибо.
Re: Как преобразовать буфер из файла в массив строк?
От: Bell Россия  
Дата: 05.06.02 07:52
Оценка:
Здравствуйте mrgrin, Вы писали:

M>Недавно занимаюсь С++ и возникла следующая задача, которая не дает двинуться дальше.

M>Я прочитал текстовый файл в строку char* buffer. Теперь мне хотелось бы, как это можно сделать в Паскале, записать построчно этот буфер в массив. Т.е., чтобы по признаку конца строки записывался новый элемент массива.
M>Заранее спасибо.

Тут можно пойти двумя путями
1. Сразу читать файл построчно, и складывать эти строки в контейнер, например так:

std::vector<std::string> aStrings; //Массив строк (кол-во строк заранее неизвестно)
std::string strTmp;
std::ifstream in("Твой файл");
while(getline(in, strTmp))
   aStrings.push_back(strTmp);


2. Считать все в оди большой массив char*, и затем преобразовать его, например так:
char* big_buf;
// заполнение big_buf
std::vector<char*> aStrings;
bool bNewLine = true;
for(int i = 0; i < nBufSize - 1; ++i)
{
   if(big_buf[i] == '\n')
      bNewLine = true;
   else
      bNewLine = false;

   if(bNewLine)
   {
      big_buf[i] = 0;
      aStrings.push_back(&big_buf[i+1]);
   }
}


В последнем варианте не обрабатывается случай, когда подряд встречаются более одного символа начала строки (наличие пустых строк), но добавить нужную функциональность не так уж и сложно.
Надеюсь идея понятна.
Любите книгу — источник знаний (с) М.Горький
Re[2]: Как преобразовать буфер из файла в массив строк?
От: Аноним  
Дата: 05.06.02 08:36
Оценка:
Здравствуйте Bell, Вы писали:

B>Тут можно пойти двумя путями

B>1. Сразу читать файл построчно, и складывать эти строки в контейнер, например так:

B>
B>std::vector<std::string> aStrings; //Массив строк (кол-во строк заранее неизвестно)
B>std::string strTmp;
B>std::ifstream in("Твой файл");
B>while(getline(in, strTmp))
B>   aStrings.push_back(strTmp);
B>


B>2. Считать все в оди большой массив char*, и затем преобразовать его, например так:

B>
B>char* big_buf;
B>// заполнение big_buf
B>std::vector<char*> aStrings;
B>bool bNewLine = true;
B>for(int i = 0; i < nBufSize - 1; ++i)
B>{
B>   if(big_buf[i] == '\n')
B>      bNewLine = true;
B>   else
B>      bNewLine = false;

B>   if(bNewLine)
B>   {
B>      big_buf[i] = 0;
B>      aStrings.push_back(&big_buf[i+1]);
B>   }
B>}
B>


Спасибо за ответ!
У меня,видимо, какая-то урезанная версия. <vector> там нет :( и
push_back пишет left of '.push_back' must have struct/union type
(а на объявление std::string strTmp; пишет
syntax error : missing ';' before ':') // stdio.h подключен...
Можно ли сделать то же самое, только в варианте строк типа С? (т.е. массивы символов?)
Re[4]: Как преобразовать буфер из файла в массив строк?
От: mrgrin  
Дата: 06.06.02 14:12
Оценка:
Спасибо!!!
Это помогло.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.