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

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

Войти
Регистрация
Восстановить пароль
 
 
Van111
209 / 188 / 4
Регистрация: 03.08.2011
Сообщений: 2,598
Записей в блоге: 12
#1

Глюк с teelg - C++

01.07.2013, 15:56. Просмотров 948. Ответов 29
Метки нет (Все метки)

C++
1
2
3
int x1 = ifile.tellg();
ifile >>s; 
x1 = ifile.tellg();
сначала х1 = 1, потом идёт считывание символа f и далее х1 становится равным -14, как это понимать?

Добавлено через 16 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <fstream>
#include <string>
using namespace std;
 
 
int main()
{
    fstream ifile;
    string s;
    ifile.open("c:\\box2.obj", ios::in);
    int x1 = ifile.tellg();
    getline(ifile,s);
    x1 = ifile.tellg();
    ifile.close();
    return 0;
}
вот ещё пример считываемая строка весит больше 20 байт, но х1 выводит что смещение равно 9 как это понимать?

Добавлено через 2 минуты
я так понял это какой то баг?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.07.2013, 15:56
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Глюк с teelg (C++):

Глюк печатания и глюк порчи константы - C++
Дамы и господа! Я столкнулся с двумя глюками, которые не нашёл в списке распространённых ошибок. 1) При попытке распечатать массив...

глюк с определениями - C++
вот файл unit.h #ifndef __unit_h__ #define __unit_h__ const int MAXHELF=100; struct FPOINT { float x; float y; };

Глюк или ? - C++
я так понимаю, можно &quot;остановить &quot; консоль(не дать закрыться) разными способами кто как делает пишу я себе программу, ставлю как всегда...

Глюк GetWindowModuleFileName - C++
Пишу продвинутый диспетчер файлов без tlhelp32.lib поэтому решил находить ModulePath с помощью GetWindowModuleFileName но столкнулся с...

глюк в программе - C++
Дан целочисленный квадратный массив размера m* n, где m и n- натуральные числа. Найти наименьшее из значений элементов столбца, который...

Глюк gcc? - C++
Компилируя программу в gcc, выводит от части неверный ответ. В code::blocks все в порядке. Как это понимать? Программа выполняет сдвиг...

29
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
02.07.2013, 22:29 #16
Цитата Сообщение от Van111 Посмотреть сообщение
код alsav22
И мои коментарии (по приведённой выше ссылке) к этому коду:
Всё работает, только непонятна цель. Вот код и результат на скрине. Делает, то что вы описали (зачем только так делать, непонятно):
Т.е. код сделан под описание ТС.
0
Van111
209 / 188 / 4
Регистрация: 03.08.2011
Сообщений: 2,598
Записей в блоге: 12
02.07.2013, 22:31  [ТС] #17
вот он (цветок в кувшине)
0
Вложения
Тип файла: rar calla_lily_with_roses2.rar (2.49 Мб, 8 просмотров)
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
02.07.2013, 22:36 #18
Цитата Сообщение от Tulosba Посмотреть сообщение
Суть в том, что проблема может быть с символами переноса строк. Под win должна быть пара \r\n, под unix - \n
Там один '\n', поэтому при открытии блокнотом не видны строки, но getline() это нормально обработает.
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
02.07.2013, 22:52 #19
А теперь конвертим в dos и смотрим результат. Без ios::binary разумеется.
0
Вложения
Тип файла: rar calla_lily_with_roses2_dos.rar (2.43 Мб, 3 просмотров)
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
02.07.2013, 23:00 #20
Посмотрели...Что сказать хотите?
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
02.07.2013, 23:03 #21
alsav22, что проблема в концовке строк. Если строки соответствуют правилам ОС, в котором читается файл, то ios::binary не нужен.
0
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
02.07.2013, 23:12 #22
Цитата Сообщение от Tulosba Посмотреть сообщение
что проблема в концовке строк. Если строки соответствуют правилам ОС, в котором читается файл, то ios::binary не нужен.
Может и не нужен, но чем мешает? Есть конкретный файл, и для этого файла, для корректной рабоы tellg(), нужен ios::binary. Я, для себя, когда-то сделал вывод, что если делаются какие-либо операции с курсором, то файл должен быть открыт в бинарном режиме, иначе могут быть глюки.
1
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
02.07.2013, 23:33 #23
У ТС с курсорами непонятки какие-то. В предыдущей теме я не понял: почему у него курсор так прыгал, и здесь тоже непонятно. Проверил его код с файлом. Если в текстовом режиме, то tellg() на две позиции больше показывает, чем размер считанной строки ('\n' обрабатывает как два символа), если в бинарном режиме, то больше на одну позицию ('\n' - как один символ). Всё как и должно быть. А у ТС строка 20 байт, а смещение 9. Чудеса!
0
Миниатюры
Глюк с teelg   Глюк с teelg  
Van111
209 / 188 / 4
Регистрация: 03.08.2011
Сообщений: 2,598
Записей в блоге: 12
03.07.2013, 12:55  [ТС] #24
Цитата Сообщение от alsav22 Посмотреть сообщение
Что сказать хотите?
что telg не работает, когда мы открываем файл obj без ios::binary

Добавлено через 10 минут
alsav22,
когда вы писали код в прошлой теме , то у вас работало всё правильно, но стоило убрать ios::binary как результат стал отличаться от желаемого. В моём же коде где я говорил про
Цитата Сообщение от alsav22 Посмотреть сообщение
А у ТС строка 20 байт, а смещение 9. Чудеса!
у меня файл открывался без ios::binary
0
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
03.07.2013, 17:11 #25
Цитата Сообщение от Van111 Посмотреть сообщение
что telg не работает, когда мы открываем файл obj без ios::binary
Это не вам вопрос был.
Цитата Сообщение от Van111 Посмотреть сообщение
у меня файл открывался без ios::binary
Я понимаю, что без, но у меня, если без (смотрите первый скрин) разница, по отношению к длине строки, на 2, как и должно быть. У вас же строка 20, а смещение 9, т.е. разница в 11. Вот это не понятно, а не то что tellg() по другому работает. У меня тоже по другому, но не настолько же по другому!
0
Van111
209 / 188 / 4
Регистрация: 03.08.2011
Сообщений: 2,598
Записей в блоге: 12
03.07.2013, 21:09  [ТС] #26
Цитата Сообщение от alsav22 Посмотреть сообщение
У вас же строка 20, а смещение 9, т.е. разница в 11
на самом деле там не 20, а 23 (это примерно сказал), что самое интересное после первого считывания из файла (обычно это 5- 6 символов) смещение становилось - 14
0
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
03.07.2013, 21:31 #27
Цитата Сообщение от Van111 Посмотреть сообщение
на самом деле там не 20, а 23 (это примерно сказал), что самое интересное после первого считывания из файла (обычно это 5- 6 символов) смещение становилось - 14
У меня на скрине тоже первое считывание из файла. У нас с вами разные файлы? Или у вас первое считывание не с начала файла? Код покажите, как вы первое считывание делаете, когда такое (не в бинарном режиме) происходит.
0
Van111
209 / 188 / 4
Регистрация: 03.08.2011
Сообщений: 2,598
Записей в блоге: 12
03.07.2013, 21:50  [ТС] #28
Цитата Сообщение от alsav22 Посмотреть сообщение
Код покажите, как вы первое считывание делаете, когда такое (не в бинарном режиме) происходит.
к сожалению (к счастью)код переписан, но вот интересная штука взгляните сначала с слип, а потом без него
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <iostream>
#include <fstream>
#include <string>
#include <Windows.h>
using namespace std;
 
 
int main()
{ 
    char NameFile[] = "c:\\calla_lily_with_roses.obj";
    int x = 0 , sum = 0;
 
    fstream ifile;
    
    ifile.open(NameFile, ios::in);
 
    string temp;
         
        int n = 0;
        while (getline(ifile, temp))
        {
            sum += temp.length() + 2 ; //  \r\n
            cout << sum <<" - " << ifile.tellg() <<endl;
            if (temp[0] == 'f')
            {
                cout << temp << endl;
                char ch = ifile.get();
                cout << ch << endl;
                ifile.seekg(-1, ios::cur);
                getline(ifile, temp);
                cout << temp << endl;
                break;
            }
        
        }
        ifile.close();
    
    
    system("pause");
    return 0;
}
файл не переведённый в формат doc!
0
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
03.07.2013, 21:53 #29
Цитата Сообщение от Van111 Посмотреть сообщение
взгляните сначала с слип
Слип - это что?
0
Van111
209 / 188 / 4
Регистрация: 03.08.2011
Сообщений: 2,598
Записей в блоге: 12
04.07.2013, 15:32  [ТС] #30
Цитата Сообщение от alsav22 Посмотреть сообщение
Слип - это что?
мм, я имел в виду Sleep() . То есть посмотрите вывод в начале - число одинаковые , и посмотрите в конце - разница в ~ 1500 байт
0
04.07.2013, 15:32
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.07.2013, 15:32
Привет! Вот еще темы с ответами:

Странный глюк цикла while - C++
Возник весьма странный глюк, связанный с циклом while. Имеется кусок программы: bool = true; while (bo=true){ ...

Странный глюк с биндом - C++
static void deXML(XMLBlock* RootBlock,Node* RN=NULL){ std::list&lt;boost::thread&gt; T; Node* SN=new...

Странный глюк с вектором - C++
Я определил операции: Присвоения: bool s; std::vector&lt;int&gt; v; void operator=(int get_i){ s = get_i &lt; 0; // знак ...

Не понятный глюк с cout - C++
Дня доброго Есть небольшая програмулина #include&lt;iostream&gt; #include&lt;string&gt; #include&lt;iomanip&gt; using namespace std; class...


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

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

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