Чтение из файла с CStdioFile
От: Mailin  
Дата: 19.10.04 07:13
Оценка:
Впервые сталкиваюсь с чтением файлов.Пишу программку считывающую из файла кооординаты точек в SDI. У меня код :
CStdioFile file;
CString strPath="E:\\tochki.txt";
if(!file.Open(strPath,CFile::modeRead | CFile::typeText ) )
{
MessageBox("File was not found");
return;
}
file.SeekToBegin();
CString& ref=m_Text;
file.ReadString(ref);
Invalidate();
}
file.Close();
Но проблема заключается в том что данный код читает только одну строку. А координаты записаны так:
(9,0)
(5,94)
Собственно вопрос:как читать следующие строки и распознать координаты?
Красота СТРАШНАЯ сила
Re: Чтение из файла с CStdioFile
От: SchweinDeBurg Россия https://zarezky.spb.ru/
Дата: 19.10.04 07:37
Оценка:
Здравствуйте, Mailin, Вы писали:

M>Собственно вопрос:как читать следующие строки и распознать координаты?


Вот кусочек кода из одного моего проекта:

try {
    CStdioFile fileDest(strDestName, CFile::modeCreate | CFile::modeWrite | CFile::typeText);
    CStdioFile fileSrc(strSrcName, CFile::modeRead | CFile::typeText);
    while (fileSrc.ReadString(strLine)) {
        SubstituteMacros(strLine);
        fileDest.WriteString(strLine + _T('\n'));
    }
}
catch (CFileException* pXcpt) {
    pXcpt->ReportError();
    pXcpt->Delete();
    RestoreWaitCursor();
}


Обратите внимание на выделенную строчку.
- Искренне ваш, Поросенок Пафнутий
Re[2]: Чтение из файла с CStdioFile
От: Mailin  
Дата: 19.10.04 14:37
Оценка:
Здравствуйте, SchweinDeBurg, Вы писали:

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


M>>Собственно вопрос:как читать следующие строки и распознать координаты?


SDB>Вот кусочек кода из одного моего проекта:


SDB>
SDB>try {
SDB>    CStdioFile fileDest(strDestName, CFile::modeCreate | CFile::modeWrite | CFile::typeText);
SDB>    CStdioFile fileSrc(strSrcName, CFile::modeRead | CFile::typeText);
SDB>    while (fileSrc.ReadString(strLine)) {
SDB>        SubstituteMacros(strLine);
SDB>        fileDest.WriteString(strLine + _T('\n'));
SDB>    }
SDB>}
SDB>catch (CFileException* pXcpt) {
SDB>    pXcpt->ReportError();
SDB>    pXcpt->Delete();
SDB>    RestoreWaitCursor();
SDB>}
SDB>


SDB>Обратите внимание на выделенную строчку.


SchweinDeBurg, понимаете ли я только новичок... Не могли бы Вы поподробнее? На сколько я понимаю Вы используете тот же класс CStdioFile и функцию ReadString. Вы читаете из одного файла и записываете в другой через переменную strLine. Отсюда у меня возникает вопрос каким образом все записано в файле fileDest в одну строку? Каким образом Вы распознаете абзац. У меня все проблемы как раз там и сидят...
Красота СТРАШНАЯ сила
Re[3]: Чтение из файла с CStdioFile
От: SchweinDeBurg Россия https://zarezky.spb.ru/
Дата: 19.10.04 18:34
Оценка:
Здравствуйте, Mailin, Вы писали:

M>На сколько я понимаю Вы используете тот же класс CStdioFile и функцию ReadString. Вы читаете из одного файла и записываете в другой через переменную strLine.


Совершенно верно.

M>Отсюда у меня возникает вопрос каким образом все записано в файле fileDest в одну строку? Каким образом Вы распознаете абзац. У меня все проблемы как раз там и сидят...


Гх-м-м... а в fileDest все записано как раз не в одну строку. Обратите внимание, что и исходный, и целевой файлы открываются в текстовом режиме:

CStdioFile fileDest(strDestName, CFile::modeCreate | CFile::modeWrite | CFile::typeText);
CStdioFile fileSrc(strSrcName, CFile::modeRead | CFile::typeText);


При чтении из файла в текстовом режиме разделителями строк считаются пары символов \r\n, причем метод CStdioFile::ReadString(CString&) записывает в передаваемый ему буфер строку, не содержащую этого разделителя. А при записи строки в "текстовый" файл каждый встречающийся в ней символ \n заменяется на пару \r\n, что и делит его на строки в понимании DOS/Windows.
[ posted via RSDN@Home 1.1.4 beta 3 r206, accompanied by Brian Setzer — Drive Like Lightning (Crash Like Thunder) ]
- Искренне ваш, Поросенок Пафнутий
Re[4]: Чтение из файла с CStdioFile
От: Mailin  
Дата: 20.10.04 12:58
Оценка:
Здравствуйте, SchweinDeBurg,

Большое Вам спасибо Я попробовала переписать из своего файла в новый созданный и все прекрасно заработало. А вот в SDI показывалась только первая строка. Теперь у меня возникают проблемы по ходу пьессы Координаты я прочитала.Может их шар обозначить? Я хочу выделить из записи (x,y) собственно координаты x и y. Как я могу обратиться к скобке и запятой? Какой это тип? Если я обзываю считываемую строку массивом типа char, и задаю условие поэлементного сравнивания массива со "( , ) " ,то он мне выдает ошибку на несовмещение типа int и char*.И еще вопрос каким образом запись:
(10,100)
(45,56)
(67,90)
содержится в массиве типа char?
Красота СТРАШНАЯ сила
Re[5]: Чтение из файла с CStdioFile
От: SchweinDeBurg Россия https://zarezky.spb.ru/
Дата: 20.10.04 13:14
Оценка:
Здравствуйте, Mailin, Вы писали:

M>Большое Вам спасибо

You're always welcome.

M>Координаты я прочитала. Может их шар обозначить?

Как это понимать?

M>Я хочу выделить из записи (x,y) собственно координаты x и y. Как я могу обратиться к скобке и запятой?

В таком случае, я бы посоветовал читать не в CString, а в массив TCHAR'ов, после чего пользоваться функциями strtok() и atoi(). Вот условный пример:

enum { MAX_CHARS = 64 };
TCHAR szTemp[MAX_CHARS + 1];
...
while (fileSrc.ReadString(szTemp, MAX_CHARS)) {
   // теперь в szTemp сидит строка вида "(123,456)\n"
   static TCHAR szSeps[] = _T("(),\n");
   int x = _ttoi(_tcstok(szTemp, szSeps));
   int y = _ttoi(_tcstok(NULL, szSeps));
}


Не компилил, но по идее должно работать. Перед тем, как пользовать этот код, советую внимательно прочесть в MSDN описание соответствующих функций — strtok() и atoi().
- Искренне ваш, Поросенок Пафнутий
Re[5]: Чтение из файла с CStdioFile
От: MicVit  
Дата: 20.10.04 13:15
Оценка:
Здравствуйте, Mailin, Вы писали:

M>Здравствуйте, SchweinDeBurg,


M>Большое Вам спасибо Я попробовала переписать из своего файла в новый созданный и все прекрасно заработало. А вот в SDI показывалась только первая строка. Теперь у меня возникают проблемы по ходу пьессы Координаты я прочитала.Может их шар обозначить? Я хочу выделить из записи (x,y) собственно координаты x и y. Как я могу обратиться к скобке и запятой? Какой это тип? Если я обзываю считываемую строку массивом типа char, и задаю условие поэлементного сравнивания массива со "( , ) " ,то он мне выдает ошибку на несовмещение типа int и char*.И еще вопрос каким образом запись:

M>(10,100)
M>(45,56)
M>(67,90)
M>содержится в массиве типа char?


Если я правильно понял вопрос, то можно использовать sscanf.

Например.
Есть строка вида "(67,90)". Считали ее в strPoint. Теперь надо получить две целые координаты, скажем в виде СPoint.


CPoint pt;
CString strPoint;

// ...  тум читаем строку

VERIFY(sscanf(strPoint.GetBuffer(0), _T("(%d,%d)"), &pt.x, &pt.y) == 2);

// теперь можем пользоваться переменной pt.



(естественно читаем много строк в цикле и сохраняем pt, например, в массив)
Re[6]: Чтение из файла с CStdioFile
От: Mailin  
Дата: 20.10.04 16:35
Оценка:
Здравствуйте, SchweinDeBurg, Вы писали:

SDB>
SDB>   static TCHAR szSeps[] = _T("(),\n");
SDB>   int x = _ttoi(_tcstok(szTemp, szSeps));
SDB>   int y = _ttoi(_tcstok(NULL, szSeps));
SDB>


Спасибо за код, но я не знаю этих функций... Я конечно в курсе что MSDN самый лучший справочник, но не дружу с ним по причине слабого английского. Может Вы посоветуете где можно почитать о функциях, которые Вы используете? Потому что те книжки по Visual C++, которые у меня, только прикладного уровня(вроде того как привязать диалог к SDI).Буду очень благодарна.
Красота СТРАШНАЯ сила
Re[7]: Чтение из файла с CStdioFile
От: SchweinDeBurg Россия https://zarezky.spb.ru/
Дата: 20.10.04 17:16
Оценка:
Здравствуйте, Mailin, Вы писали:

M>Спасибо за код, но я не знаю этих функций... Я конечно в курсе что MSDN самый лучший справочник, но не дружу с ним по причине слабого английского.


Катя, я я не хочу Вас огорчать, но если Вы собираетесь зарабатывать на жизнь программированием, то Вам придется учить английский (технический) и подружиться с MSDN.

M>Может Вы посоветуете где можно почитать о функциях, которые Вы используете? Потому что те книжки по Visual C++, которые у меня, только прикладного уровня(вроде того как привязать диалог к SDI).Буду очень благодарна.


Есть такая книжка "Как программировать на C" (именно на C, а не на C++), авторы Х.М.Дейтел и П.Дж.Дейтел — там в "Приложениях" есть краткая справка по функциям CRT. Издательство БИНОМ. 2000-й год.
[ posted via RSDN@Home 1.1.4 beta 3 r206, accompanied by Rainbow — Catch The Rainbow ]
- Искренне ваш, Поросенок Пафнутий
Нескромное дополнение
От: SchweinDeBurg Россия https://zarezky.spb.ru/
Дата: 20.10.04 18:09
Оценка:
Про работу со строками и преобразование данных (strtok, atoi и иже с ними) можно еще почитать здесь:
http://home.peterstar.ru/zarezky/lectures/crt/strdatacvt.html

P.S.
На русском.
[ posted via RSDN@Home 1.1.4 beta 3 r206, accompanied by Rainbow — Stargazer ]
- Искренне ваш, Поросенок Пафнутий
Re[8]: Чтение из файла с CStdioFile
От: Mailin  
Дата: 21.10.04 09:03
Оценка:
Здравствуйте, SchweinDeBurg, Вы писали:


SDB>Катя, я я не хочу Вас огорчать, но если Вы собираетесь зарабатывать на жизнь программированием, то Вам придется учить английский (технический) и подружиться с MSDN.


Я все прекрасно понимаю, но не всегда понимаю перевод. Мне порой легче в коде разобраться... Я знаю что придется... и выучу, но пока без базы на русском тяжеловато. Собственно все мои вопросы для того чтобы написать программу, которая строит выпуклые множества. Чтение точек из файла, двойная буферизация и реализация всех вычислений в одном потоке. Использование функций C, при чтении координат из файла запрещается либо MFC либо WinApi.
Спасибо за книгу. Попробую поискать.
Красота СТРАШНАЯ сила
Re[6]: Чтение из файла с CStdioFile
От: Mailin  
Дата: 21.10.04 10:24
Оценка:
Здравствуйте, MicVit,
Большое Вам спасибо!!! Все прекрасно работает !!! Ура!!!
Красота СТРАШНАЯ сила
Re: Чтение из файла с CStdioFile
От: Аноним  
Дата: 22.10.04 15:44
Оценка:
Здравствуйте, Mailin, Вы писали:

M>Впервые сталкиваюсь с чтением файлов.Пишу программку считывающую из файла кооординаты точек в SDI. У меня код :

M>CStdioFile file;
M>CString strPath="E:\\tochki.txt";
M>if(!file.Open(strPath,CFile::modeRead | CFile::typeText ) )
M>{
M>MessageBox("File was not found");
M>return;
M>}
M>file.SeekToBegin();
M>CString& ref=m_Text;
M>file.ReadString(ref);
M>Invalidate();
M>}
M>file.Close();
M>Но проблема заключается в том что данный код читает только одну строку. А координаты записаны так:
M>(9,0)
M>(5,94)
M>Собственно вопрос:как читать следующие строки и распознать координаты?

А зачем использовать CStdioFile??
Есть всеми пhоверенный и рррабочий FILE
Вот пример его использования:
FILE *Zig = fopen(strPath,"r");
if(Zig)
{
fseek(Zig,0L,SEEK_SET);
while(!feof(Zig))
{
fscanf(Zig,"%g%g",&point.x,&point.y);//в твоем случае с двумя точками это будет так
}
fclose(Zig);
}
Re[2]: Чтение из файла с CStdioFile
От: Mailin  
Дата: 24.10.04 08:25
Оценка:
Здравствуйте, Аноним,
Вы мое последнее сообщение не читали...Можно использовать либо MFC, либо WinApi, а функции C нельзя.
Красота СТРАШНАЯ сила
Re[6]: Чтение из файла с CStdioFile
От: _Ahriman_ Украина  
Дата: 18.11.05 17:55
Оценка:
Здравствуйте, MicVit, Вы писали:

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


M>>Здравствуйте, SchweinDeBurg,


M>>Большое Вам спасибо Я попробовала переписать из своего файла в новый созданный и все прекрасно заработало. А вот в SDI показывалась только первая строка. Теперь у меня возникают проблемы по ходу пьессы Координаты я прочитала.Может их шар обозначить? Я хочу выделить из записи (x,y) собственно координаты x и y. Как я могу обратиться к скобке и запятой? Какой это тип? Если я обзываю считываемую строку массивом типа char, и задаю условие поэлементного сравнивания массива со "( , ) " ,то он мне выдает ошибку на несовмещение типа int и char*.И еще вопрос каким образом запись:

M>>(10,100)
M>>(45,56)
M>>(67,90)
M>>содержится в массиве типа char?


MV>Если я правильно понял вопрос, то можно использовать sscanf.


MV>Например.

MV>Есть строка вида "(67,90)". Считали ее в strPoint. Теперь надо получить две целые координаты, скажем в виде СPoint.


MV>
MV>CPoint pt;
MV>CString strPoint;

MV>// ...  тум читаем строку

MV>VERIFY(sscanf(strPoint.GetBuffer(0), _T("(%d,%d)"), &pt.x, &pt.y) == 2);

MV>// теперь можем пользоваться переменной pt.
MV>



MV>(естественно читаем много строк в цикле и сохраняем pt, например, в массив)


Вопрос. Я читаю строку из памяти: sscanf((char *)GlobalLock(hMem), _T("(%d,%d,%d)"), &r, &x, &y);
Каким образом можно осуществить переход на следующую строку?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.