2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 не работает сдвиг
Сообщение08.10.2011, 00:54 
Аватара пользователя


23/01/08
565
Код:
int reading(char *path, unsigned long long *x_)
{   unsigned long long x;
   unsigned char simbol;
   ifstream inFile;
   x = *x_;      
   inFile.open(path);
   if (inFile.is_open() == NULL)
   {      cout << "File "<<'\"'<<path<<'\"'<<" not open" << '\n';
      return 1;
   }
   for (int i = 0; i < 8; i++)
   {
      simbol = inFile.get();   
      if (simbol == EOF)
         break;
      x+=simbol;
      cout<<x<<"\n";
      if (i != 7)
         x<<8;
   }
   inFile.close();
   *x_ = x;
   return 0;
}

 Профиль  
                  
 
 Re: не работает сдвиг
Сообщение08.10.2011, 01:13 
Заслуженный участник


04/05/09
4582
Вам нужен сдвиг с присваиванием: <<=
А ещё мне кажется сдвигать надо до сложения и каждый раз, но это зависит от того, что вам нужно.

Ещё замечания:
1. Добавьте const к объявлению параметра path:
Код:
int reading(const char *path, unsigned long long *x_)

2. Не надо сравнивать is_open() с NULL:
Код:
if (!inFile)

3. Переменная simbol (лучше symbol), должна быть объявлена int, иначе проверка на EOF работать не будет.

4. Явно вызывать close() не обязательно - файл закроется в деструкторе. Да и открывать лучше прямо в конструкторе:
Код:
ifstream inFile(path);


... ну ещё много чего можно сказать...

 Профиль  
                  
 
 Re: не работает сдвиг
Сообщение08.10.2011, 04:47 
Заслуженный участник


26/07/09
1559
Алматы
Наверное, можно делать сразу *x_<<=8 выкинув таким образом x. И, возможно, стоит в начале функции написать *x_=0.

 Профиль  
                  
 
 Re: не работает сдвиг
Сообщение08.10.2011, 21:35 
Аватара пользователя


23/01/08
565
venco в сообщении #490529 писал(а):
Вам нужен сдвиг с присваиванием: <<=
точно! на ночь глядя не сообразил :-)
venco писал(а):
ну ещё много чего можно сказать...
предыдущие замечания устранил, если не сложно, дайте другие советы!

-- Сб окт 08, 2011 21:37:06 --

Circiter в сообщении #490539 писал(а):
Наверное, можно делать сразу *x_<<=8 выкинув таким образом x. И, возможно, стоит в начале функции написать *x_=0.
Не слишком силен в указателях, перестраховался) Но попробую и так, чтобы разобраться и чтобы код солиднее выглядел.

-- Сб окт 08, 2011 22:13:31 --

venco в сообщении #490529 писал(а):
3. Переменная simbol (лучше symbol), должна быть объявлена int, иначе проверка на EOF работать не будет.
Я считываю символы из текстового файла, мне нужно, чтобы они хранились как целые положительные числа. Это обеспечивает unsigned char. Подойдет ли unsigned int?

 Профиль  
                  
 
 Re: не работает сдвиг
Сообщение09.10.2011, 00:14 
Заслуженный участник


04/05/09
4582
Spook в сообщении #490774 писал(а):
venco в сообщении #490529 писал(а):
3. Переменная simbol (лучше symbol), должна быть объявлена int, иначе проверка на EOF работать не будет.
Я считываю символы из текстового файла, мне нужно, чтобы они хранились как целые положительные числа. Это обеспечивает unsigned char. Подойдет ли unsigned int?
unsigned int не подойдёт. Подойдёт int.
istream.get() возвращает значение типа int. Если конец файла, то значение равно -1 (EOF), иначе значение в диапазоне 0-255 - очередной байт из потока ввода.
Судя по сдвигам, поток совсем не текстовый, а бинарный. Для текстовых чисел парсер должен быть сложнее.

 Профиль  
                  
 
 Re: не работает сдвиг
Сообщение10.10.2011, 23:10 
Аватара пользователя


23/01/08
565
venco, Вы правы, нужен просто int. По поводу парсера - сдвиг использую для составления числа из прочитанных символов) Код исправил, работает правильно, спс.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 6 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group