Текстовый файл в вектор
От: tdebug Беларусь  
Дата: 15.12.04 22:43
Оценка:
Как поместить содержимое текстового файла в vector из строк чтобы каждоя строка файла стала соотвественно каждой строкой в векторе? Какой тип строки (String, CString) лучше использовать в этом vector контейнере, если потом надо будет обрабатывать эту строку — находить там определённые слова и выводить также построчно в CListBox весь этот vector массив.
Re: Текстовый файл в вектор
От: SchweinDeBurg Россия https://zarezky.spb.ru/
Дата: 16.12.04 05:00
Оценка:
Здравствуйте, tdebug, Вы писали:

T>Как поместить содержимое текстового файла в vector из строк чтобы каждоя строка файла стала соотвественно каждой строкой в векторе? Какой тип строки (String, CString) лучше использовать в этом vector контейнере, если потом надо будет обрабатывать эту строку — находить там определённые слова и выводить также построчно в CListBox весь этот vector массив.


ИМХО из соображений единообразия кода в данном случае не стоит мешать STL и MFC (если под вектором Вы подразумевали std::vector<>). В качестве строкового класса я бы рекомендовал воспользоваться MFC-шным CString-ом, а в качестве контейнера — шаблоном CArray<CString, LPCTSTR>.

Построчное чтение текстового файла в массив можно выполнить, например, так:

CStdioFile file;
CString strTemp;
CArray<CString, LPCTSTR> arrLines;

if (file.Open(имя_файла, CFile::modeRead | CFile::typeText)) {
    while (file.ReadString(strTemp)) {
        arrLines.Arr(strTemp);
    }
    file.Close();
}
else {
    AfxMessageBox(_T("Unable to open file!"));
}


Поиск слов можно осуществить с помощью метода CString::Find() примерно так (по всем строкам вектора):

int iWordStart;

for (int i = 0, cLines = arrLines.GetSize(); i < cLines; ++i) {
    if ((iWordStart = arrLines[.Find([i]искомое_слово)) != -1) {
        // искомое_слово в данной строке начинается с позиции iWordStart
    }
    else {
        // искомое_слово в данной строке отсутствует
    }
}


Ну а "запипсь" строк в list box можно выполнить так:

CListBox listLines;

... // создаем контрол методом Create() или "связываемся" с ним с помощью DDX_Control()

for (int i = 0, cLines = arrLines.GetSize(); i < cLines; ++i) {
    listLines.AddString(arrLines[[i]);
}
[ posted via RSDN@Home 1.1.4 beta 3 r241 ]
- Искренне ваш, Поросенок Пафнутий
Re[2]: Текстовый файл в вектор
От: Аноним  
Дата: 16.12.04 07:06
Оценка:
Здравствуйте, SchweinDeBurg, Вы писали:

SDB>Здравствуйте, tdebug, Вы писали:


T>>Как поместить содержимое текстового файла в vector из строк чтобы каждоя строка файла стала соотвественно каждой строкой в векторе? Какой тип строки (String, CString) лучше использовать в этом vector контейнере, если потом надо будет обрабатывать эту строку — находить там определённые слова и выводить также построчно в CListBox весь этот vector массив.


SDB>ИМХО из соображений единообразия кода в данном случае не стоит мешать STL и MFC (если под вектором Вы подразумевали std::vector<>). В качестве строкового класса я бы рекомендовал воспользоваться MFC-шным CString-ом, а в качестве контейнера — шаблоном CArray<CString, LPCTSTR>.


Учтите, что он (CArray<CString, LPCTSTR>) тормоз
Re[3]: Текстовый файл в вектор
От: SchweinDeBurg Россия https://zarezky.spb.ru/
Дата: 16.12.04 07:59
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Учтите, что он (CArray<CString, LPCTSTR>) тормоз


Ну, здесь уже все от объемов зависит — я с тормозами не сталкивался. Кроме того, не будем забывать про метод CArray::SetSize().
[ posted via RSDN@Home 1.1.4 beta 3 r241 ]
- Искренне ваш, Поросенок Пафнутий
Re[2]: Текстовый файл в вектор
От: BlackHeretic Израиль  
Дата: 16.12.04 08:16
Оценка:
Здравствуйте, SchweinDeBurg, Вы писали:

SDB>Здравствуйте, tdebug, Вы писали:


T>>Как поместить содержимое текстового файла в vector из строк чтобы каждоя строка файла стала соотвественно каждой строкой в векторе? Какой тип строки (String, CString) лучше использовать в этом vector контейнере, если потом надо будет обрабатывать эту строку — находить там определённые слова и выводить также построчно в CListBox весь этот vector массив.


SDB>ИМХО из соображений единообразия кода в данном случае не стоит мешать STL и MFC (если под вектором Вы подразумевали std::vector<>). В качестве строкового класса я бы рекомендовал воспользоваться MFC-шным CString-ом, а в качестве контейнера — шаблоном CArray<CString, LPCTSTR>.


SDB>Построчное чтение текстового файла в массив можно выполнить, например, так:


SDB>
SDB>CStdioFile file;
SDB>CString strTemp;
SDB>CArray<CString, LPCTSTR> arrLines;

SDB>if (file.Open(имя_файла, CFile::modeRead | CFile::typeText)) {
SDB>    while (file.ReadString(strTemp)) {
SDB>        arrLines.Arr(strTemp);
SDB>    }
SDB>    file.Close();
SDB>}
SDB>else {
SDB>    AfxMessageBox(_T("Unable to open file!"));
SDB>}
SDB>


SDB>Поиск слов можно осуществить с помощью метода CString::Find() примерно так (по всем строкам вектора):


SDB>
SDB>int iWordStart;

SDB>for (int i = 0, cLines = arrLines.GetSize(); i < cLines; ++i) {
SDB>    if ((iWordStart = arrLines[.Find([i]искомое_слово)) != -1) {
SDB>        // искомое_слово в данной строке начинается с позиции iWordStart
SDB>    }
SDB>    else {
SDB>        // искомое_слово в данной строке отсутствует
SDB>    }
SDB>}
SDB>


SDB>Ну а "запипсь" строк в list box можно выполнить так:


SDB>
SDB>CListBox listLines;

SDB>... // создаем контрол методом Create() или "связываемся" с ним с помощью DDX_Control()

SDB>for (int i = 0, cLines = arrLines.GetSize(); i < cLines; ++i) {
SDB>    listLines.AddString(arrLines[[i]);
SDB>}
SDB>


Небольшое дополнение. CStdioFile хреново работает в юникодовой конфигурации, если вдруг захочется прочесть текстовый файл в ASCII (MBCS) кодировке. Бажина есть такая у MFC.
Из личного опыта — прочтите файл полностью с помощью CFile, затем перекодируйте в юникод (если все ж таки работаете в нем) и распарсите самостоятельно.
Если есть проблема с парсением — могу кинуть код как это делается.
ICQ 156156278
Re[3]: Текстовый файл в вектор
От: SchweinDeBurg Россия https://zarezky.spb.ru/
Дата: 16.12.04 08:23
Оценка:
Здравствуйте, BlackHeretic, Вы писали:

BH>Небольшое дополнение. CStdioFile хреново работает в юникодовой конфигурации, если вдруг захочется прочесть текстовый файл в ASCII (MBCS) кодировке. Бажина есть такая у MFC.

BH>Из личного опыта — прочтите файл полностью с помощью CFile, затем перекодируйте в юникод (если все ж таки работаете в нем) и распарсите самостоятельно.
BH>Если есть проблема с парсением — могу кинуть код как это делается.

Ну, и мои 5 копеек:

CTextFileDocument

CTextFileDocument lets you write and read text files with different encodings (ASCII, UTF-8, Unicode 16 little/big endian are supported).


P.S.
Для неюникодного варианта можно еще посмотреть вот это:

CTextFile: A handy helper

While perhaps not the most impressive of classes, this one is at least useful. It lets you read, write and append to text files from a CString or CStringArray, as well as load and save to and from list- and editboxes. While not what you need to manage your data in an application, it can be used for configuration files, text dumps during development and other such small tasks. And — it will pop up a file dialog if no file name is given to any of the member calls.

[ posted via RSDN@Home 1.1.4 beta 3 r241 ]
- Искренне ваш, Поросенок Пафнутий
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.