powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / запись строки в CFile
8 сообщений из 8, страница 1 из 1
запись строки в CFile
    #33201751
Slip
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я записываю в файл (VC++ 6.0, MFC) строки CString, делаю это так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
CString str = "123";
CFile file;
file.Open(... , CFile::modeCreate | CFile::modeWrite);
int sz = str.GetLength();
file.Write(&sz, sizeof(int));
if(sz!= 0 ){
    file.Write(str.GetBuffer(sz), sz*sizeof(char));
}
file.Close();
Потом из этого файла считываю эту же строку:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
CFile file;
file.Open(... , CFile::modeRead);
int sz;
CString str;
file.Read(&sz, sizeof(int));
if(sz!= 0 ){
    char* pstr = new char[sz];
    file.Read(pstr, sz*sizeof(char));
    str = pstr;
    delete[]pstr;
}else{
    str = "";
}
file.Close();

Но при этом в str записывается не "123", а что-то вроде "123ээээЭ". Подскажите пожалуяста, что здесь не так? Заранее спасибо.
...
Рейтинг: 0 / 0
запись строки в CFile
    #33201985
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
file.Write(str.GetBuffer(sz), sz*sizeof(char));

Здесь не надо GetBuffer вызывать. Write не модифицирует str.
А если вызываешь - надо вызывать и ReleaseBuffer.
Надо так :

Код: plaintext
1.
file.Write(LPCTSTR(str), sz*sizeof(char));
...
Рейтинг: 0 / 0
запись строки в CFile
    #33202002
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ой, билин, держи
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
CString str = "123";
CFile file;
file.Open(... , CFile::modeCreate | CFile::modeWrite);
int sz = str.GetLength();
file.Write(&sz, sizeof(int));
if(sz!= 0 )
  file.Write(LPCTSTR(str), sz*sizeof(TCHAR));
file.Close();

// .....

CFile file;
file.Open(... , CFile::modeRead);
int sz;
CString str;
file.Read(&sz, sizeof(int));
if(sz)
{
    file.Read(str.GetBuffer(sz), sz*sizeof(TCHAR));
    str.ReleaseBuffer(sz);
}
else
  str.Empty();

file.Close();
...
Рейтинг: 0 / 0
запись строки в CFile
    #33202081
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
То, что вижу...ошипки то бишь..
1) по поводу освобождения буффера стринга уже прозвучало.
2)
Slip....int sz = str.GetLength();....
это Вы длину чаво взяли ? Если прочтёте MSDN повнимательней, то обратите внимание что это не есть длина данных, а длина АЛЛОКИРОВАННОЙ памяти под данные (!) CString может хранить и юникоде - не забывайте !
3) не стоит делать нью когда читаете. просто сделайте GetBuffer и ReleaseBuffer (если не обшибся в названиях).

Ваши проблемы думаю зарыты во втором пункте.

удачи Вам
(круглый)
...
Рейтинг: 0 / 0
запись строки в CFile
    #33202558
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не путай человека, все GetLength правильно возвращает - длину строки в кол-ве символов. Единстренное, что для MBCS (типа utf-8) он будет возвращать кол-во байт, а не unicode-символов, но я думаю, это здесь ни при чем.
...
Рейтинг: 0 / 0
запись строки в CFile
    #33204250
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivНе путай человека, все GetLength правильно возвращает - длину строки в кол-ве символов.....

в том числе и НУЛИ !!!


В MSDN... И побыстрее... Это стандартная ошибка программистов...Даже такой контрольный вопрос когда то давали вновь прибывающим... Как тэст на знакомство с одним из часто используемым классом в MFC

Если не верите - попробуйте впихнуть в CString байт сто (например пробелов), потом обрезать нулём (ну скажем на втором байтике) и позовите сей метод...
Вы удивитесь возвращаемому значению.

удачи Вам
(круглый)
...
Рейтинг: 0 / 0
запись строки в CFile
    #33205148
AndreiNz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для строковых операций есть CStdioFile.
...
Рейтинг: 0 / 0
запись строки в CFile
    #33208916
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kolobok0 MasterZivНе путай человека, все GetLength правильно возвращает - длину строки в кол-ве символов.....
в том числе и НУЛИ !!!

Ну да, он вернет заполненную длину строки в байтах или символах.
Ну и что с этого ?
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / запись строки в CFile
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]