На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
  
> Неожиданный результат работы getline
    Тестовый файл настроек имеет вид:
    100; первый параметр
    программа; второй параметр
    13.23; третий параметр
    В программе
    ExpandedWrap disabled
      #include <string>
      #include <iostream>
      #include <fstream>
      #include <memory.h>
      #include <stdio.h>
       
      using namespace std;
       
      int main()
      {
        setlocale(LC_ALL, "");
        ifstream fileIn("program.ini", ios::in);
        if(!fileIn)
        {
          cout << "Файл настроек не найден!" <<  endl;
          system("pause");
          exit(EXIT_FAILURE);
        }
        const int nArr = 128;
        char buf[nArr];
        while(fileIn)
        {
          fileIn.getline(&buf[0], nArr, ';');
          cout << buf;
        }
        cout << endl;
        fileIn.close();
        system("pause");
      }
    я надеялся, что будут считываться только символы до точки с запятой, т.к. точка с запятой появляется раньше конца строки и количества символов. Однако у меня считывается строка целиком. Что я делаю неправильно? Проект прикрепил.
    Прикреплённый файлПрикреплённый файлCppStudyCons.zip (2,24 Кбайт, скачиваний: 84)
      Цитата tuchin @
       
          cout << buf;

      По-моему, забыл здесь поставить std::endl
        Да, действительно забыл. Но все равно, результат не тот, который я хотел достичь. Я хотел бы считывать в строке только символы до точки запятой, а сейчас считывается и часть строки после точки с запятой. Как лучше решить эту задачу?
          Поставь точку с запятой в конце строки
            Цитата tuchin @
            Как лучше решить эту задачу?

            ExpandedWrap disabled
              std::string line;
              std::getline(fileIn, line);
              size_t idx = line.find(';');
              if(idx != std::string::npos)
                 line = line.substr(0, idx);
              Да была задумка такая: точка с запятой отделяет значение параметра, а после точки с запятой - пояснение назначения параметра. Хотелось бы считать только значение параметра из строки.
                Чем мой вариант не устроил?
                  Цитата tuchin @
                  Да была задумка такая: точка с запятой отделяет значение параметра, а после точки с запятой - пояснение назначения параметра. Хотелось бы считать только значение параметра из строки.

                  Тогда делай getline два раза - первый раз до ';', второй - до '\n'. И проверяй каждый раз !fileIn
                    Цитата Олег М @
                    Тогда делай getline два раза - первый раз до ';', второй - до '\n'. И проверяй каждый раз !fileIn

                    Без дополнительных (и сомнительных) манипуляций с позицией в потоке это работать не будет.
                    Сообщение отредактировано: shm -
                      Там тебе ещё наверное надо будет пробелы убирать. Лучше уж считай всё строку, а потом распарcь её при помощи sscanf. Ну или сам файл сразу начитывай через fscanf

                      Добавлено
                      Цитата shm @
                      Без дополнительных(и сомнительных) манипуляций с позицией в потоке это работать не будет.

                      Это каких?
                        Цитата Олег М @
                        Это каких?

                        Ну ты попробуй реализовать свою идею и прогони на любом ini'шнике с комментариями в середине.
                        Сообщение отредактировано: shm -
                          Цитата shm @
                          Ну ты попробуй реализовать свою идею и прогони на любом ini'шнике с комментариями в середине.

                          Здесь вроде задача не стояла насчёт любого инишника.
                            Цитата tuchin @
                            Хотелось бы считать только значение параметра из строки.

                            Это крайне неудачное решение. Сомневаюсь, что оно реализуемо вообще.
                            ---
                            Все строки в файле следуют одна за другой.
                            Значит, чтобы прочитать последующую строку, надо или прочитать предыдущую
                            целиком, либо читая часть её, потом (как-то ?) определив её размер
                            сдвинуть указатель файла на начало следующей строки.
                            ---
                            Дешевле и понятнее считывать строки целиком, а потом разбирать их содержимое.
                            И ещё вот это:
                            ExpandedWrap disabled
                               while(fileIn)
                                {
                              ...
                                }

                            Может попробовать как-то так ?
                            ExpandedWrap disabled
                              while(!fileIn.eof())
                                {
                              ...
                                }
                            Сообщение отредактировано: ЫукпШ -
                              Скачал–посмотрел. Не, ну там двух getline на строку, как я писал выше, будет достаточно. Можно даже и без проверок между ними.
                              Сообщение отредактировано: Олег М -
                                Мне больше понравился вариант shm. Спасибо всем ответившим.
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0667 ]   [ 19 queries used ]   [ Generated: 25.04.24, 07:10 GMT ]