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

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

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

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

08.12.2009, 20:04. Просмотров 3418. Ответов 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 всё работало как надо,в чём я сегодня убедился.Хотелось бы узнать,почему так происходит,и что добавляет винда в строку,или может,дело в кодировке или ещё в чём-то? Просто хочется понять,и открывать текстовый файл в текстовом режиме,без "костылей".
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.12.2009, 20:04
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Странность работы функций [ifstream&] tellg() и seekg() на разных платформах (C++):

Тип возвращаемого значения ifstream::tellg() - C++
tellg якобы возвращает std::streampos, а если перейти к определению typedef typename _Traits::pos_type pos_type; pos_type...

Какие различия у функций seekg и seekp для работы с файлами? - C++
Есть такая формулировка: seekg случайный доступ к потоку ввода seekp случайный доступ к потоку вывода Отсюда...

Сравнение двух 128-и бытных числа на разных платформах оптимальным способом - C++
Hello World! :) Ребят, есть два 128-и битных числа, допустим: char* a; //по указателю первые 16 байт - это целое знаковое число типа...

Ifstream& как член класса - C++
Здравствуйте. Решаю задачу: Напишите функцию, получающую и качестве аргументов istream и vector&lt;string&gt; и возвращающую map&lt;string,...

ofstream & ifstream :: binary read-write struct - C++
Не пойму в чем дело... но я не могу считать всю структуру FNTBINARY из файла, файл - это она и есть в бинарном виде, одна структура...

Перегрузка ifstream и ofstream для работы с файлами в little-endian формате? - C++
Всем привет, мне нужно реализовать классы для работы с файлами в little-endian формате. Для этого задумал сделать public-потомки...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.12.2009, 20:04
Привет! Вот еще темы с ответами:

Проверка работы сайта на разных платформах, ОС - Denwer
Всем доброго дня! Пишу диплом, следовательно сайт на локалке, выгружать в интернет нет необходимости. Планирую написать мобильную версию...

Аналог EntityFramework, работающий на разных платформах - .NET
Кто знает, есть ли библиотеки с функционалом примерно как у EntityFramework, но portable ? В частности интересует - отслеживание...

[Android, XE5] Странное поведение медиаплеер на разных платформах - Delphi FireMonkey
Пробуем написать мобильное FireMonkey-приложение медиаплеера на Delphi XE5 и запустить его на Андроиде. Можно взять штатный пример из...

Как сделать, чтобы блоки не переносились на разных платформах? - HTML, CSS
Попробовал все варианты предложенные на данном форуме но так и не нашёл решения. Проблема состоит в том что при отображения сайта на других...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

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