1296 / 469 / 151
Регистрация: 24.08.2011
Сообщений: 2,249
1

Проверка на достижение конца файла не рао

30.03.2015, 20:57. Показов 2525. Ответов 17
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    ofstream f("tmp");
    ifstream idx(idxAdress);
    int index;
    idx.seekg(0, ios::end);
    ios::pos_type endPos = idx.tellg();
    idx.seekg(0, ios::beg);
    ios::pos_type beginPos = idx.tellg();
    while (idx.tellg() != endPos)
    {
        idx >> index;
        f << index << ' ';
    }
    f.close();
    idx.close();
(В проекте см. database.cpp, строка 192) Проблема со строкой while (idx.tellg() != endPos). Почему-то когда файл не пуст, это условие становится постоянно равно true, и программа зацикливается. Помогите пожалуйста понять почему

P.S. Насчет того что написано через одно место не надо пожалуйста, сама знаю
Вложения
Тип файла: rar Work.rar (7.43 Мб, 3 просмотров)
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.03.2015, 20:57
Ответы с готовыми решениями:

Определить достижение конца экрана
У меня есть GridView и в нем изображения как при скролинге определить когда будет достигнут конец...

Проверка на достижение локации на карте
Хотелось бы динамически получать координаты и выводить их в виде тоста. @Override protected...

Проверка наличия маркера конца файла
Здравствуйте форумчане! Изучаю тему &quot;Работа с файлами&quot; перепечатал код с учебника,но что-то он не...

Проверка конца файла(формат .cvs (таблица MS Excel)
Есть файл, формата .cvs, который содержит несколько строк, как правильно должен выглядеть цикл...

17
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
30.03.2015, 21:04 2
В файле что, и в каком виде?
1
1296 / 469 / 151
Регистрация: 24.08.2011
Сообщений: 2,249
30.03.2015, 21:06  [ТС] 3
В файле числа через пробел
0
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
30.03.2015, 21:10 4
Среда какая? У меня (10-я студия), кусок кода из первого поста, работает. В файле: 1 2 3 4 5

Добавлено через 2 минуты
Для таких манипуляций, файл лучше открывать в бинарном режиме.
1
1296 / 469 / 151
Регистрация: 24.08.2011
Сообщений: 2,249
30.03.2015, 21:13  [ТС] 5
MS VC++ 2010
Собственно, файл создается программой, забыла уточнить
Описание этого и подобных файлов, которые создаются программой:
Кликните здесь для просмотра всего текста
. Индексные файлы можно организовать просто. Например, в базе есть три поля имя, группа, возраст и нужно упорядочивать по имени или по группе. Предположим, что каждая запись занимает по 256 байт в файле.
Сидоров ВБМО31 21
Иванов ВБМО32 20
Петров ВБМО31 19
Смещение до начала первой записи 0, смещение до начала второй записи 256, смещение до третьей записи 512.
Тогда создаются два файла, хранящие целые значения – смещения в файле с данными до
записей, упорядоченных по соответствующему полю:
Файл index1. idx (упорядочение по первому полю):
256
512
0
т.к. по алфавиту вначале следует «Иванов», затем «Петров», затем «Сидоров».
Файл index2. idx (упорядочение по второму полю):
0
512
256
т.к. по алфавиту вначале следует «ВБМО31», затем «ВБМО31», затем «ВБМО32».
Тогда, если надо вывести содержимое базы в виде, отсортированном по первому полю, открывается файл index1. idx читается целое число – смещение до начала записи, потом указатель текущей позиции в файле с данными смещается на эту величину, читается запись, выводится на экран и т.д.

Аа с бинарными я вообще еще не работала... Имеет большое значение?
0
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
30.03.2015, 21:13 6
'\n' в конце файла есть?
1
1296 / 469 / 151
Регистрация: 24.08.2011
Сообщений: 2,249
30.03.2015, 21:14  [ТС] 7
Нет
При добавлении чисел в файл добавляется просто число и пробел
0
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
30.03.2015, 21:20 8
Цитата Сообщение от Керра Посмотреть сообщение
Описание этого и подобных файлов, которые создаются программой:
Лучше файл выложите, с которым ошибка возникает.

Добавлено через 2 минуты
Если вот так:
C++
1
2
3
4
5
6
    while (idx.tellg() != endPos)
    {
        idx >> index;
        idx.clear();
        f << index << ' ';
    }
Добавлено через 2 минуты
Зачем так проверку конца файла делаете? Так нужно, или ради эксперимента?
1
1296 / 469 / 151
Регистрация: 24.08.2011
Сообщений: 2,249
30.03.2015, 21:24  [ТС] 9
Ошибка возникает при изменении файла. То есть при добавлении очередного числа в нужное место. В файле при этом лежит только "0 ", т.е. 0 и пробел. Во время выполнения цикла этих нулей становится, естественно, бесконечное множество.

C idx.clear(); все равно виснет
Миниатюры
Проверка на достижение конца файла не рао   Проверка на достижение конца файла не рао   Проверка на достижение конца файла не рао  

Проверка на достижение конца файла не рао  
0
1296 / 469 / 151
Регистрация: 24.08.2011
Сообщений: 2,249
30.03.2015, 21:25  [ТС] 10
На последнем скрине видно что индексный файл первого столбца пытается обновляться, и на этом благополучно виснет. А с первой строкой все было норм
0
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
30.03.2015, 21:33 11
Лучший ответ Сообщение было отмечено MayaNash как решение

Решение

Цитата Сообщение от Керра Посмотреть сообщение
На последнем скрине видно что индексный файл первого столбца пытается обновляться, и на этом благополучно виснет. А с первой строкой все было норм
Раз у меня выложенный кусок кода работает, значит дело не в нём, а в других действиях с файлом.
Цитата Сообщение от lss Посмотреть сообщение
Зачем так проверку конца файла делаете? Так нужно, или ради эксперимента?
1
1296 / 469 / 151
Регистрация: 24.08.2011
Сообщений: 2,249
30.03.2015, 21:44  [ТС] 12
При пошаговом выполнении у меня программа зацикливалась именно тут. Хотя на всякий случай сейчас еще раз прокручу.

Эксперимент. Ну, неудачный... Но хоть поработала наконец с этими seek-ами и tell-ами
Поменяла на
C++
1
2
3
4
5
6
7
8
    while (true)
    {
        idx >> index;
        if (!idx.eof())
            f << index << ' ';
        else
            break;
    }
Если не учитывать что сортировка все еще неправильная, стало ок. Хотя бы не глючит))

Добавлено через 42 секунды
Хотя мне все еще непонятно почему это не сработало
0
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
30.03.2015, 21:53 13
Цитата Сообщение от Керра Посмотреть сообщение
while (true)
* * {
* * * * idx >> index;
* * * * if (!idx.eof())
* * * * * * f << index << ' ';
* * * * else
* * * * * * break;
* * }
C++
1
2
    while (idx >> index)
        f << index << ' ';
1
1296 / 469 / 151
Регистрация: 24.08.2011
Сообщений: 2,249
30.03.2015, 21:53  [ТС] 14
О, прикольно, спасибо
0
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
30.03.2015, 22:10 15
Попробовал сейчас в работе вашу программу. По-моему, там косяков много. Есть такое правило: всегда проверять файл на открытие для чтения. У вас в программе, нет ни одной такой проверки. Советую этим правилом не пренебрегать.
0
1296 / 469 / 151
Регистрация: 24.08.2011
Сообщений: 2,249
30.03.2015, 22:12  [ТС] 16
Ну, косяков очевидно много, я ж таки только студент
Да, насчет проверок в курсе, но программы пока настолько несерьезные, что забываю привыкать это таки делать (хотя одна проверка таки есть, в 92-й строке)
0
lss
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
30.03.2015, 22:34 17
Цитата Сообщение от Керра Посмотреть сообщение
(хотя одна проверка таки есть, в 92-й строке)
Не вижу там проверки открытия (в Database(string name)). Действия с потоком там начинаются без всякой проверки открытия:
C++
1
2
ifstream infoFile(infoFileAdress);
infoFile >> nCols;
0
1296 / 469 / 151
Регистрация: 24.08.2011
Сообщений: 2,249
30.03.2015, 22:41  [ТС] 18
аа... нуу... да)) нет))
0
30.03.2015, 22:41
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.03.2015, 22:41
Помогаю со студенческими работами здесь

Функция, определяющая достижение начала файла: есть ли такая?
Собственно мне нужна функция, проверяющая достижение начала файла, типа feof только наоборот....

Проверка конца строки
Дана строка длиной 80 символов. Словом называется последовательность непробелов, окруженная...

Проверка конца текста
Нужно переслать на сервер строку неизвестной длинны. Пробовал использовать для знака окончания...

Неравенство Рао - Крамера
Мне нужно показать, что выполняется неравенство Рао - Крамера. Я нашла эффективную оценку и...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru