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

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

Войти
Регистрация
Восстановить пароль
 
akrosing
1 / 1 / 0
Регистрация: 08.01.2009
Сообщений: 6
#1

Неожиданное окончание файла - C++

05.02.2010, 17:45. Просмотров 597. Ответов 4
Метки нет (Все метки)

Требуется организовать побитовое чтение файла (формат .dat) и компоновка (перестановка 2-х бит) в массив. Написал код. Возникла проблема: происходит неожиданный конец файла (eof) при 85 кадре (1 кадр = чтение 2-х бит). При чтении того же самого файла и вместо fin >> x1 использовать fin.get(x1) конец происходит на 83 кадре. Причём эти прочтённые кадры соответсвуют действительности( проверенно при чтении файла матлабом и маткадом) - всего кадров около 1000.
При чтении другого файла (той же размерности и структуре) неожиданный конец файла может возникать при других кадрах (к примеру 5-ый).
При чтении простого файла .txt, содержащего массив цифр - всё ок.
В чём может быть проблема?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
if (OpenDialog1->Execute())
{
    Edit1->Text = OpenDialog1->FileName;
    ifstream fin(OpenDialog1->FileName.c_str());
    int i=0;                      // счётчик, определяет номер кадра (1 кадр - 2 бита)
    short int str[100000];  // массив куда будут записываться значения из файла
 
    while ( (!fin.eof() ) & (i<100000))
    {
       char x1 , x2;
       fin >> x1; fin >> x2 ;  // запись последовательных 2-х битов х1 и х2.
 
      short int p2 = x2<<8 ;                 // меняем биты местами: х1 становится старшим битом
      unsigned short int p1 = x1 & 255 ; // х2 становится младшим битом
// в результате получили код аскии целого 4-х значного числа
// (Это известно из условия - информация 100% правильная)
 
      str[i] = int(p1+p2);                     // записываем результат в конечный массив
      i++;
    }
 
    fin.close();
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.02.2010, 17:45
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Неожиданное окончание файла (C++):

Окончание файла - C++
Доброго вечера! В тхт файле всего одна строка из 12 символов- 12 байт. Пытаюсь ее прочитать но читается она только с лишними каракулями в ...

Проверка на окончание файла - C++
#include &lt;iostream&gt; #include &lt;fstream&gt; #include &lt;typeinfo&gt; #include &lt;cstdlib&gt; using namespace std; const int size = 100; ...

Неожиданное завершение программы - C++
простенькая программа, нужно ввести двумерный массив, после чего во втором массиве написать в iый элемент 1, если элементы iой строки 1ого...

Неожиданное значение в статической переменной - C++
Всем привет! Либо мне надо отдохнуть, либо происходит что-то неведомое... Код int f() { static int b = 3; if(b == 3) ...

Неожиданное завершение программы на Windows - C++
Вообщем такая беда, решал задачку с одного сайта, решал ее в облаке от Cloud9, там Ubuntu стоит. Все замечательно работает не придраться....

Неожиданное закрытие консольной программы - C++
Делаю лично для себя программку находящая целочисленные корни уравнения 6-ой степени. Все написал, запускается без ошибок, а после ввода...

4
JKeeJ1e30
12 / 12 / 0
Регистрация: 04.02.2010
Сообщений: 45
05.02.2010, 17:51 #2
Скорее всего тут дело в выделении памяти под это чтение, особенно если ты говоришь что на других компиляторах все по-другому. Врядли тебе здесь ответят, надо рыться в технических тонкостях
0
akrosing
1 / 1 / 0
Регистрация: 08.01.2009
Сообщений: 6
06.02.2010, 00:25  [ТС] #3
Разобрался спасибо. Про "другие компиляторы" я вообще-то не писал...

Проблема оказалась не в памяти, а в самих битах в файле. Некоторые биты были управляющие, поэтому при чтении выполнялась их функция.
Всё разрешилось при использовании fin.get и вместо счётчика конца файла (!fin.eof()) использовать надо было длину файла, которую предварительно надо было найти.

В частности проблема была бы решена если бы чтение из файла сразу шло в переменную (лучше символьную) имеющую размерность 2 байта (один требуемый кадр) - тогда не нужно было бы менять местами байты. Использование short int никаких результатов не дало. Может есть другие более подходящие для этого типы?
0
odip
Эксперт С++
7158 / 3220 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
06.02.2010, 17:27 #4
Некоторые биты были управляющие, поэтому при чтении выполнялась их функция.
Почему ты байты называешь битами ?
0
akrosing
1 / 1 / 0
Регистрация: 08.01.2009
Сообщений: 6
07.02.2010, 09:58  [ТС] #5
Цитата Сообщение от odip Посмотреть сообщение
Почему ты байты называешь битами ?
Потому что иногда их путаю (не в смысле что они означают, а в смысле произношения). Везде где выше я написал бит подразумевается байт.
0
07.02.2010, 09:58
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.02.2010, 09:58
Привет! Вот еще темы с ответами:

Неожиданное поведение fflush(), неправильная работа функции - C++
Никак не пойму почему код не хочет работать последовательно, так, как я ему указал.Что не так я делаю с fflush? Функция запрашивает лишь...

Неожиданное поведение программы: найти ошибку в коде - C++
Программа запрашивает у пользователя «Сколько Вам лет?» . Вы вводите положительное число до 100. Программа должна выдать пол-ный ответ «...

Неожиданное поведение программы: исправить ошибку в коде - C++
извиняюсь за возможно глупый вопрос, но почему программа говорит,что в выделенной строке ошибка? хотел написать в ней: а в квадрате + в в...

Неожиданное поведение программы: почему не работает цикл while? - C++
Проблема: Цикл While при != является бесконечным ,а при == не выполняется ни разу Ожидаемое поведение: После входа в цикл N должно быть...


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

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

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