Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 27, средняя оценка - 4.70
#pragma
Временно недоступен
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
#1

Странность работы функций [ifstream&] tellg() и seekg() на разных платформах - C++

08.12.2009, 20:04. Просмотров 3374. Ответов 0
Метки нет (Все метки)

В моей программе файл читается посимвольно и открывается на чтение в текстовом виде
C++
1
source.open(filename, ifstream::in);
Где-то в недрах программы используется такая конструкция:
C++
1
2
3
4
     unsigned long c = source.tellg();
     if (parser_GetToken() == TOKEN_COMMA) 
        error(CONST_REQUIRED);
     source.seekg(c);
Смысл которой прост: запомнить позицию указателя,заглянуть вперёд в файл,вернуться на исходную позицию.Строка,читающаяся на этот момент выглядит так:
PureBasic
1
LET mystring$ = STR$(34787868)
На момент ипользования функции tellg() указатель находится как раз на открывающейся скобке после слова "STR$" .Дело в том,что на Linux всё работает нормально,и "c" принимает значение 21,но если открыть файл в любом windows редакторе (включая в моём текстовом поле в GUI), и сохранить его,то тогда на обоих платформах "c" почему-то принимает значение 42. Мало того,возврат в ту же точку с помощью seekg() уже не возможен.Я уже в курсе,что windows добавляет в конец строки символ \r,но в этом случае тут что-то другое. Я спрашивал на IRC канале вчера,там один парень сделал тестовый пример
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <fstream>
#include <string>
#include <iostream>
 
using namespace std;
 
int main()
{
  ifstream in("source.bas");
  string s;
  for(int i=0; i != 10; ++i) {
    getline(in,s);
  }
  ifstream::pos_type p = in.tellg();
  getline(in,s);
  cout << "Read:" << s << '\n';
  {
    ifstream in2("source.bas");
    in2.seekg(p);
    getline(in2,s);
    cout << "Read:" << s << '\n';
  }
}
И он утверждал,что это работает по разному на разных компиляторах. И,что интересно,после включения флага ifstream::binary всё работало как надо,в чём я сегодня убедился.Хотелось бы узнать,почему так происходит,и что добавляет винда в строку,или может,дело в кодировке или ещё в чём-то? Просто хочется понять,и открывать текстовый файл в текстовом режиме,без "костылей".
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.12.2009, 20:04     Странность работы функций [ifstream&] tellg() и seekg() на разных платформах
Посмотрите здесь:
C++ Тип возвращаемого значения ifstream::tellg()
Какие различия у функций seekg и seekp для работы с файлами? C++
Сравнение двух 128-и бытных числа на разных платформах оптимальным способом C++
Ifstream& как член класса C++
ofstream & ifstream :: binary read-write struct C++
C++ Перегрузка ifstream и ofstream для работы с файлами в little-endian формате?
C++ Что делает tellg?
Почему значение tellg() не изменяется? C++
C++ Std::istream::tellg нумерация символов
Ошибка: multiple definition of `void std::swap<A>(A&amp;, A&amp;) C++
Различия ifstream::get() и ifstream::get(ch) C++
C++ Запись в файл из разных функций

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru