Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Чтение из файла 
:(
    Опции темы
skrip
Дата 9.8.2006, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



в файле file.txt есть две строки
ааа ааа ааа
ввв ввв ввв


не могу разобраться почему без помеченой знаками (!) строчке
вторая строка не прибавляется в st, а с ней все работет
замечательно. 
Код

#include <iostream.h>
#include <fstream.h>

void read_string(std::fstream &file, std::string &st)
    {
    char ch;
    while(ch != 10)
        {
        file.read((char*)&ch, 1);
        st+=ch;
        };
    };

std::fstream file;
std::string st;

int main()
{
    file.open("file.txt", std::ios::in);
    read_string(file, st);
    std::cout << file.tellg(); //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    read_string(file, st);
    file.close();
    std::cout << st;
return 0;
};

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


666
**


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

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



надо инициализировать переменную ch в ф-ии read_string (например нулём).
иначе её значение после первого вызова read_string не сбрасывается и остается равным 10
PM MAIL   Вверх
Rockie
Дата 9.8.2006, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



а также добавить условие окончания файла. например 
Код
while(ch!= 10 && !file.eof())



--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
vinter
Дата 9.8.2006, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


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

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




Цитата

иначе её значение после первого вызова read_string не сбрасывается и остается равным 10

не согласен ch локальная переменная и после выхода из ф-ии перестает существовать, а при входе заново создается..
Просто компилятор постоянно "глючит" если пытается использовать неинициализированную переменную
Код

  char ch;//определил    
  while(ch != 10)//использует не пойми какое значение




--------------------
Мой блог
PM MAIL WWW   Вверх
dumb
Дата 9.8.2006, 18:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


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

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



vinter, согласен ты или не согласен, но при последовательном вызове одной и той же функции с неинициализированными стековыми переменными, значения оных с большой долей вероятности будут сохраняться от предыдущих вызовов.

Добавлено @ 18:31 
понятия "перестает существовать" и "заново создается" существуют только в теории. на практике все несколько иначе.
PM MAIL   Вверх
vinter
  Дата 9.8.2006, 19:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


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

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



Цитата

огласен ты или не согласен, но при последовательном вызове одной и той же функции с неинициализированными стековыми переменными, значения оных с большой долей вероятности будут сохраняться от предыдущих вызовов.

конечно же вероятность существует, только очень призрачная.. Специально проверил ,5 раз вызывад ф-ю и не разу она не повторил значение переменной которым была проин. переменная внутри ф-ии!!!Неиниц. переменная помещается в регистр ,а не вынемается из него так что вероятность очень мала smile 
Слышали про такое понятие "Время жизни переменной"??
Цитата

понятия "перестает существовать" и "заново создается" существуют только в теории. на практике все несколько иначе.

Конечно же разработчики компиляторов подлые лгуны, а книги пишут полные ламеры smile 
Цитата

 на практике все несколько иначе.

не раскажете как??





Это сообщение отредактировал(а) vinter - 9.8.2006, 19:17


--------------------
Мой блог
PM MAIL WWW   Вверх
MAKCim
Дата 9.8.2006, 20:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



Цитата

Слышали про такое понятие "Время жизни переменной"??

стековая память для переменной не обнуляется, изменяется только указатель стека
а для объектоа классов компилятором генерируется вызов деструктора в месте выхода его за область видимости
в данном случае
происходит
Код

void read_string(std::fstream &file, std::string &st)
    {
    char ch;                                                   //   уменьшение SP на 1 и запись куда-нибудь текущего смещения в стеке
    while(ch != 10)
        {
        file.read((char*)&ch, 1);
        st+=ch;
        };
    }; // увеличение SP на 4+размер параметров функции

то есть сами данные неизменны, изменяется SP, значение ch сохраняется при втором вызове
так что baronp прав

Добавлено @ 20:28 
Цитата

не раскажете как??

в случае с POD-типами - просто изменение SP и контроль за использованием вне области видимости на этапе компиляции
в случае с объектами - вызов деструктора


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
vinter
Дата 9.8.2006, 20:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


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

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



А стек тут причем??? неинициализированная переменная помещается не в стек , А в РЕГИСТР


--------------------
Мой блог
PM MAIL WWW   Вверх
MAKCim
Дата 9.8.2006, 20:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



Цитата

А стек тут причем??? неинициализированная переменная помещается не в стек , А в РЕГИСТР 

где написано?
а тут
Код

int A()
{
    long a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w;
}

регистров не хватит  smile 
объекты тоже в регистры засовывать?  smile 

Это сообщение отредактировал(а) MAKCim - 9.8.2006, 20:38


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
vinter
Дата 9.8.2006, 20:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


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

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



Мы же говорим о конкретном примере.. Оптимизтрующий компилятор при обьявлении одной переменной скорее всего положит ее в регистр(для экономии времени).Не ну если много тогда конечно в стек...Но мы то имеем всего одну переменную...
Цитата

в случае с POD-типами

А это что такое(просто не знаю)?



--------------------
Мой блог
PM MAIL WWW   Вверх
MAKCim
Дата 9.8.2006, 20:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



Цитата

Мы же говорим о конкретном примере.. Оптимизтрующий компилятор при обьявлении одной переменной скорее всего положит ее в регистр(для экономии времени).Не ну если много тогда конечно в стек...Но мы то имеем всего одну переменную...

спорный вопрос все-таки...
Цитата

А это что такое(просто не знаю)?

Цитата

A POD (plain old data) object has one of these data types--a fundamental type, pointer, union, struct, array, or class--with no constructor. Conversely, a non-POD object is one for which a constructor exists. A POD object begins its lifetime when it obtains storage with the proper size for its type and its lifetime ends when the storage for the object is either reused or deallocated.



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
dumb
Дата 10.8.2006, 00:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


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

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



vinter, как бы это так помягче-то?... в общем, ты высказал немало утверждений(причем зачастую излишне эмоционально, да еще и сразу в двух темах), которые с действительностью никак не пересекаются.

Цитата(vinter @  9.8.2006,  20:46 Найти цитируемый пост)
Мы же говорим о конкретном примере.. Оптимизтрующий компилятор при обьявлении одной переменной скорее всего положит ее в регистр(для экономии времени).Не ну если много тогда конечно в стек...Но мы то имеем всего одну переменную...

это зависит от компилятора, параметров компиляции, от того, как переменная используется, какого она типа, модели вызова функции итд итп.
а если уж речь зашла о конкретном случае, то компилятор никогда не "соптимизирует" переменную ch в регистр, ибо как-то так сложилось, что в качестве буфера для приема данных регистры не используются.
PM MAIL   Вверх
vinter
Дата 10.8.2006, 18:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


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

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



dumb мы на "ты" не переходили smile 
почитайте вот это
Цитата

а если уж речь зашла о конкретном случае, то компилятор никогда не "соптимизирует" переменную ch в регистр, ибо как-то так сложилось, что в качестве буфера для приема данных регистры не используются.

можно узнать откуда такие сведения(для собственного просвещения)
Цитата

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

где это? то что я назвал "инициализацией " немного другой процесс(что то я нигде не встречал стандарта по названиям), многие даже именитые авторы книг по программированию называют разными словами одинаковые вещи?? в сущности я не был неправ...




--------------------
Мой блог
PM MAIL WWW   Вверх
En_t_end
Дата 10.8.2006, 18:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



vinter
Прикрепи сюда ассемблерный листинг этой программы твоего компилятора, тогда и спорам конец.
PM MAIL ICQ Skype GTalk Jabber   Вверх
vinter
Дата 10.8.2006, 19:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


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

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



вот есть кусок кода:
Код

void read_string()
{
0041D2B0  push        ebp  
0041D2B1  mov         ebp,esp 
0041D2B3  sub         esp,0D8h 
0041D2B9  push        ebx  
0041D2BA  push        esi  
0041D2BB  push        edi  
0041D2BC  lea         edi,[ebp-0D8h] 
0041D2C2  mov         ecx,36h 
0041D2C7  mov         eax,0CCCCCCCCh 
0041D2CC  rep stos    dword ptr [edi] 
    char p;почему здесь ничего не происходит???Обьясните пожалуйста
    char ch = 10;    
0041D2CE  mov         byte ptr [ch],0Ah :вот кстати заносит значение в сегмент данных ,а не стека
    while(ch != 10)
0041D2D2  movsx       eax,byte ptr [ch] 
0041D2D6  cmp         eax,0Ah 
0041D2D9  je          read_string+31h (41D2E1h) 
    {
          ch = 10;    
0041D2DB  mov         byte ptr [ch],0Ah 
        };    
0041D2DF  jmp         read_string+22h (41D2D2h) 
}

попробуйте посмотрите при отладке значение переменной...у меня оно ни разу не установилось в 10 при опред. без инициализации


--------------------
Мой блог
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




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


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

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