Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Срочно нужна помощь в работе с файлами 
:(
    Опции темы
Puzanova
Дата 5.1.2009, 22:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 5.1.2009

Репутация: нет
Всего: нет



Всем ,доброго времени суток!
Ребята, кто может ,помогите пожалуйста!!!!!
Я не могу справиться с ошибкой, а у меня очень мало осталось времени на доработку, а вот дорабатывать ещё много.
Проблема заключается в следующем.
Пишу в Visual Studio 2005 на MFC
Пытаюсь считать с файла, данные не считываютя.
Тело конструкции 
while (fin) {
...
}
при пошаговом прогоне  игнорируется. Я примерно понимаю, в чём проблема.  Для открытия файлов с русскими символами в пути или имени необходимо использовать UNICODE или MULTIBYTE кодировку. А вот как её применять у меня нет никаких мыслей. Помогите , пожалуйста.
Привожу кусок кода:
// Открытие файла с заготовками
void CcuttingDoc::OnFilePolyOpen()
{    
   // вывод диалога для открытия данных из файла 
  CFileDialog dlg (TRUE,_T("*.plg"), _T("*.plg") ,OFN_HIDEREADONLY, _T(" Laba                       Files (*.plg) |*.plg||"));
  if (dlg.DoModal()==IDOK) {
         CString str, file_name;    
        file_name=dlg.GetPathName();      // получаем путь
            this->file_name = file_name;       //запоминаем путь
        std::ifstream fin;
        fin.open(file_name,std::ios::in); // открытие файла
        std::istream& ignore(int n = 1, int delimiter = EOF); 
    while (fin) {
              ……
        }      
 
      this->UpdateAllViews(0);
  }
}

Заранее спасибо)))

PM MAIL   Вверх
Earnest
Дата 6.1.2009, 18:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Стало быть fin у тебя false, раз игнорируется. Насколько я помню, для потока это означает, что он не открыт. Вот с этим и разбирайся.


--------------------
...
PM   Вверх
Puzanova
  Дата 6.1.2009, 19:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 5.1.2009

Репутация: нет
Всего: нет



Earnest, спасибо за столь ценное замечание. Но мой вопрос и заключался именно в этом. Я не понимаю, в чем может быть там ошибка. Абсолютно такая же  конструкция ститывания файла в этом же проекте работает замечательно.  Может есть какие-нибудь мысли по этому поводу?

PM MAIL   Вверх
Earnest
Дата 6.1.2009, 19:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Цитата(Puzanova @  6.1.2009,  20:05 Найти цитируемый пост)
Но мой вопрос и заключался именно в этом

Так бы и сказала. Кто тебя поймет, что ты понимаешь, а что нет.
Цитата(Puzanova @  6.1.2009,  20:05 Найти цитируемый пост)
Может есть какие-нибудь мысли по этому поводу?

Да, конечно. Пройдись пошагово дебагером - я имею в виду внутрь open. Ничего там страшного нет, разберешься, где оно не открывает. Естественно, приглядывайся к значениям переменных.
ИМХО, проблема либо с именем файла, либо с его состоянием (нет его, открыт еще кем-то, итд, итп)

Цитата(Puzanova @  5.1.2009,  23:09 Найти цитируемый пост)
 this->file_name = file_name; 

И что это за хрень? Написано "a=a".

Добавлено через 5 минут и 50 секунд
Вот еще:
Цитата(Puzanova @  5.1.2009,  23:09 Найти цитируемый пост)
 Для открытия файлов с русскими символами в пути или имени необходимо использовать UNICODE или MULTIBYTE кодировку. А вот как её применять у меня нет никаких мыслей. 

Ты ее уже применяешь - какую-то. Если ты используешь ifstream, то подразумевается, что и в файле не Юникод, и имя файла не-юникодовое. Потому что это поток char. Иначе действительно могут быть проблемы. Проверь свои установки, какие строки ты используешь - широкие или "обычные".




--------------------
...
PM   Вверх
Dmi3ev
Дата 6.1.2009, 22:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1698
Регистрация: 28.11.2007

Репутация: нет
Всего: 41



Цитата

Пытаюсь считать с файла, данные не считываютя.

тут как раз самое интересное, а ты точек понаставил...
Цитата

    while (fin) {
              ……
        }      

и вообще не так лучше писать, а так:
Код

while(!fin.eof())
{
 //...
}


Добавлено через 2 минуты и 39 секунд
Цитата

fin.open(file_name,std::ios::in);

вот так достаточно!
Код

fin.open(file_name);




--------------------

PM MAIL   Вверх
Puzanova
Дата 8.1.2009, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 5.1.2009

Репутация: нет
Всего: нет



Всем добрый день.

Earnest, я не понимаю, зачем  разбирать конструкции записанные в While когда обработчик туда не заходит?))я уверенна, что собака зарыта в пути   .  Почему-то не хочет открываться файл.
Привожу полностью считывание с файла:
  
void CcuttingDoc::OnFilePolyOpen()
{
 // очиска предыдущих данных
    object.FigInRaskroi.clear();
    UpdateAllViews(NULL);
    std::vector<PointCoord> TmpPt;// временный вектор для хранения точек
    int n;                        // номер точки в данной фигуре
    size_t Num                // кол-во точек в фигуре всего
    double Xmin,Ymin,Xmax,Ymax,x,y;// минимальные и максимальные координаты 
                                    // многоугольников
                                  // (x,y)-координаты текущей точки.
    size_t count_top         // число вершин
    
  // вывод диалога для открытия данных из файла 
    CFileDialog dlg (TRUE, "*.plg","3.plg",OFN_HIDEREADONLY, "Type Files (*.plg)|*.plg||");
  if (dlg.DoModal()==IDOK) {
        CString str, file_name;
        file_name=dlg.GetPathName();      // получаем путь
        std::ifstream fin;
        fin.open(file_name,std::ios::in); // открытие файла
        std::istream &ignore(int n=1, int delimeter=EOF);
    while (fin) {
            size_t count_polygon;           // количество полигонов
            fin.ignore(5,'=');       // игнорируем 5 символов до "="
            fin >> count_polygon;           // запоминаем кол-во полигонов
      for(size_t i=0; i<=count_polygon;++i) {
            std::string name_polygon;  // имя полигона
            fin >> name_polygon;       // считываем имя данного полигона
        // устанавливаем имя i-ого полигнона
            name.Name.Format(name_polygon.c_str());
            fin.ignore(20,'=');
            fin >> count_top;          // запоминаем кол-во вершин мног-ка
            name.My_Top_First.clear();     // очищаем вектор точек                TmpPt.clear();
               //Тут я считываю ещё координаты        
        }
    int ind = object.RawData.size(); //получаем размер вектора полигонов
                               //удаляем последний полигон из вектора
    if (ind>0){
      object.RawData.erase(object.RawData.begin()+ind-1);}    
      this->UpdateAllViews(0);
  }  
}

В проекте есть 2 вида счтывание с файла. Считывание заготовок и считывание карты раскроя. Вообщем к чему это всё: Считывание заготовок(которое чобственно и не работает) работает,если сначала проделать считывание раскроя. В коде они никак не связанны,я не понимаю в чём зависимоть. 




Цитата(Dmi3ev @  6.1.2009,  22:32 Найти цитируемый пост)
и вообще не так лучше писать, а так:

код C++
1:while(!fin.eof())
2:{
3:  //...
4:  }


eof() компилятор ругается(((((


Спасибо за помошь 
PM MAIL   Вверх
Earnest
Дата 8.1.2009, 20:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Цитата(Puzanova @  8.1.2009,  14:49 Найти цитируемый пост)
Earnest, я не понимаю, зачем  разбирать конструкции записанные в While когда обработчик туда не заходит?))

А я это и не предлагала. Я предлагала зайти в open. И посмотреть на соответствие кодировок.


--------------------
...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0737 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.