Как поместить содержимое текстового файла в vector из строк чтобы каждоя строка файла стала соотвественно каждой строкой в векторе? Какой тип строки (String, CString) лучше использовать в этом vector контейнере, если потом надо будет обрабатывать эту строку — находить там определённые слова и выводить также построчно в CListBox весь этот vector массив.
Здравствуйте, 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 ]
Здравствуйте, <Аноним>, Вы писали:
А>Учтите, что он (CArray<CString, LPCTSTR>) тормоз
Ну, здесь уже все от объемов зависит — я с тормозами не сталкивался. Кроме того, не будем забывать про метод CArray::SetSize().

[ posted via RSDN@Home 1.1.4 beta 3 r241 ]
Здравствуйте, 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, затем перекодируйте в юникод (если все ж таки работаете в нем) и распарсите самостоятельно.
Если есть проблема с парсением — могу кинуть код как это делается.
Здравствуйте, 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 ]