Впервые сталкиваюсь с чтением файлов.Пишу программку считывающую из файла кооординаты точек в 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)
Собственно вопрос:как читать следующие строки и распознать координаты?
Здравствуйте, SchweinDeBurg, Вы писали:
SDB>Здравствуйте, Mailin, Вы писали:
M>>Собственно вопрос:как читать следующие строки и распознать координаты?
SDB>Вот кусочек кода из одного моего проекта:
SDB>
SchweinDeBurg, понимаете ли я только новичок... Не могли бы Вы поподробнее? На сколько я понимаю Вы используете тот же класс CStdioFile и функцию ReadString. Вы читаете из одного файла и записываете в другой через переменную strLine. Отсюда у меня возникает вопрос каким образом все записано в файле fileDest в одну строку? Каким образом Вы распознаете абзац. У меня все проблемы как раз там и сидят...
Здравствуйте, Mailin, Вы писали:
M>На сколько я понимаю Вы используете тот же класс CStdioFile и функцию ReadString. Вы читаете из одного файла и записываете в другой через переменную strLine.
Совершенно верно.
M>Отсюда у меня возникает вопрос каким образом все записано в файле fileDest в одну строку? Каким образом Вы распознаете абзац. У меня все проблемы как раз там и сидят...
Гх-м-м... а в fileDest все записано как раз не в одну строку. Обратите внимание, что и исходный, и целевой файлы открываются в текстовом режиме:
При чтении из файла в текстовом режиме разделителями строк считаются пары символов \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) ]
Большое Вам спасибо Я попробовала переписать из своего файла в новый созданный и все прекрасно заработало. А вот в SDI показывалась только первая строка. Теперь у меня возникают проблемы по ходу пьессы Координаты я прочитала.Может их шар обозначить? Я хочу выделить из записи (x,y) собственно координаты x и y. Как я могу обратиться к скобке и запятой? Какой это тип? Если я обзываю считываемую строку массивом типа char, и задаю условие поэлементного сравнивания массива со "( , ) " ,то он мне выдает ошибку на несовмещение типа int и char*.И еще вопрос каким образом запись:
(10,100)
(45,56)
(67,90)
содержится в массиве типа char?
Здравствуйте, 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().
Здравствуйте, 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.
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).Буду очень благодарна.
Здравствуйте, 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 ]
SDB>Катя, я я не хочу Вас огорчать, но если Вы собираетесь зарабатывать на жизнь программированием, то Вам придется учить английский (технический) и подружиться с MSDN.
Я все прекрасно понимаю, но не всегда понимаю перевод. Мне порой легче в коде разобраться... Я знаю что придется... и выучу, но пока без базы на русском тяжеловато. Собственно все мои вопросы для того чтобы написать программу, которая строит выпуклые множества. Чтение точек из файла, двойная буферизация и реализация всех вычислений в одном потоке. Использование функций C, при чтении координат из файла запрещается либо MFC либо WinApi.
Спасибо за книгу. Попробую поискать.
Здравствуйте, 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);
}
Здравствуйте, 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>(естественно читаем много строк в цикле и сохраняем pt, например, в массив)
Вопрос. Я читаю строку из памяти: sscanf((char *)GlobalLock(hMem), _T("(%d,%d,%d)"), &r, &x, &y);
Каким образом можно осуществить переход на следующую строку?