Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Visual C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.11.2011, 15:56   #1
ashtone9130
Пользователь
 
Регистрация: 17.01.2010
Сообщений: 45
По умолчанию Работа с файлами

Делаю программу в Visual Studio 6 (MFC), которая будет работать с текстовыми файлами..... программа дожна будет считывать данные с файла (цифры) построчно.... как определить в программе что при чтении файла каретка дошла до конца строки, если размер строки не известен??... понятно что при записи данных в файл программа записывает в каждой строке \n\r ... делаю такой цикл:
Код:
z = "End Str";
for (int y = 0; y!=11; y++)
         {
           File.Seek(y, CStdioFile::begin); 
           File.ReadString(m_Z);
           m_Edit.SetWindowText(m_Z);
	   if (m_Z == "\n"  )
	      {
                    m_Edit2.SetWindowText(z);
	      }
         }
m_Z переменная типа CString


цикл считывает каждый символ из файла ( в созданном файле 3 строки по 2 числа), и посути при обноружении символа переноса на новую строку, должен вывести сообшение в эдит о конце строки, пробовал всё делать и без цикла, задавал положение каретки в место где дожен быть знак переноса на новую строку, ничего не происходит... пытался и вместо "f (m_Z == "\n" )" написать так "f (m_Z == "0x0A" )" разницы никакой...... так как же определить что в файле стоит знак переноса на новую строку или хотя бы как определить что началась новая строка??

файл открыт через CStdioFile в режиме "CFile::typeText" если открыть файл в бинарном режиме "CFile::typeBinary" то можно отследить перенос каретки на начало строки "\r" но при выводе чисел из текстового файла он выводится вместе с числами, точнее не он а какой то значёк, тоесть вместо обычного числа я получаю "7|"

Последний раз редактировалось ashtone9130; 24.11.2011 в 16:20.
ashtone9130 вне форума Ответить с цитированием
Старый 03.04.2012, 21:44   #2
mr_cipher
Пользователь
 
Регистрация: 05.03.2012
Сообщений: 29
По умолчанию

По-моему, Вы считываете строку. А потом пытаетесь сравнить всю считанную строку со строкой "\n".
Двойными кавычками задаются строки, одинарными- символ. \n- это СИМВОЛ. т.е. надо так '\n'. И проверку производить надо в цикле по элементам строки m_Z.
Может так будет правильней:
Код:
int i=1
while (m_Z[i]!='\n')
{
i++;
}
А ещё попробуйте метод CString.Find();
mr_cipher вне форума Ответить с цитированием
Старый 04.04.2012, 03:53   #3
microbit
Форумчанин
 
Аватар для microbit
 
Регистрация: 26.09.2011
Сообщений: 176
По умолчанию

по моему очевидно, что метод ReadString читает строки.
microbit вне форума Ответить с цитированием
Старый 04.04.2012, 10:17   #4
mr_cipher
Пользователь
 
Регистрация: 05.03.2012
Сообщений: 29
По умолчанию не факт

Цитата:
Сообщение от ashtone9130 Посмотреть сообщение
понятно что при записи данных в файл программа записывает в каждой строке \n\r
Кстати совсем не факт, что программа пишет строки. Если писать через CStdioFile.WriteString() то надо обязательно в конец строки добавлять \n вручную. Поэтому может быть что символов конца строки просто нет. Хотя, кажется "очевидно, что пишет строку".
mr_cipher вне форума Ответить с цитированием
Старый 04.04.2012, 12:34   #5
ashtone9130
Пользователь
 
Регистрация: 17.01.2010
Сообщений: 45
По умолчанию

вообщем то с этим вопросом я давно разобрадся, но всёравно спасибо за ответы, может поэксперементирую ещё)).. в конце каждой строки действительно стоит \r\n, это пределяется легко, считывая строку с конца, и постепернно передвигая указатель, моно заметить что по окончанию строки, есть ещё 2 позиции, которые не видно ( понятно что это \r\n), а вот потом указатель переходит на новую строку..

решение получилось вот такое (правда не обошлось без помощи на других форумах):

Код:
void split(CString str, CArray<int, int>* arr) 
   {
   int p, n = 0;
   for(p = 0; str.FindOneOf(_T("0123456789")) != -1; str.Delete(0, p)) {
       sscanf(str.LockBuffer(), "%d%n", &n, &p);
       arr->Add(n);
   } 
}
 
void CDlg::OnButton1() 
{
   const int size = 3;
   CArray<int, int> arr[size];
 
   CStdioFile fp;
   if(! fp.Open(_T("D:\\numbers.txt"), CFile::modeRead | CFile::typeText)) 
       {
         MessageBox(_T("Файл не найден !"), _T("error"), MB_OK | MB_ICONERROR);
         return;
       }
 
   CString line;
   for(int i = 0; i < size && fp.ReadString(line); i++) 
          split(line, &arr[i]);
   fp.Close();
 
 
   for(int j = 0; j < arr[0].GetSize(); j++) 
   {
        line.Format("%d", arr[0][j]);
        MessageBox(line);
   }
}
ashtone9130 вне форума Ответить с цитированием
Старый 04.04.2012, 12:46   #6
mr_cipher
Пользователь
 
Регистрация: 05.03.2012
Сообщений: 29
По умолчанию

я натолкнулся на эту тему случайно )
А ну правильно, Вы решили вообще не искать символ конца строки и сразу обрабатывать данный.

Последний раз редактировалось mr_cipher; 04.04.2012 в 12:48.
mr_cipher вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
работа с файлами nikcpp Общие вопросы Delphi 2 11.05.2011 15:04
Работа с файлами Natysya Общие вопросы C/C++ 10 24.11.2010 16:39
C работа с файлами svetikpgaek Помощь студентам 0 26.12.2009 22:13