Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

[Язык С] Работа с bin файлами. Чтение удалось... а запись

14K
11 февраля 2007 года
demonoide
30 / / 11.02.2007
Приятного времени суток.

Такая задача:
Компоненты типизированного файла – вещественные числа. Поменять местами первый компонент файла с минимальным, а последний – с максимальным.

Исходный bin файл: http://cpp.do0om.by.ru/bin-pr/text.txt

В нём хранятся: 3.1 4.3 5.4 1.5 2.1

Вот то, что я написал:
Код:
#include <stdio.h>
#include <conio.h>

int main()
{
 FILE *fin;
 float x, maxf=-65355, minf=65356, first,last;
 int i=0,max=0,min=0;
 
 fin=fopen("text.txt","r+b");
 
 if (fin==NULL)
  {
   printf("Cannot open or create file");
   getch(); return 0;
  }
 
  fscanf(fin, "%f", &first);
  fseek(fin,0L,SEEK_SET);

  printf ("BEFORE:\n");

 while (fread (&x,sizeof(float),1,fin))
 { if (x>maxf) maxf=x;
   if (x<minf) minf=x;
  printf("%f ",x);
 }
  fseek(fin,0L,SEEK_SET);

 while (fread (&x,sizeof(float),1,fin))
 { i++;
   if (x==maxf) max=i;
   if (x==minf) min=i;
 }

/*------------------------------------------------------------------*/  
//Читаем 1й и посл. элементы
  fseek(fin,0L,SEEK_SET);
 fread(&first,1,4,fin);
  fseek(fin,0L,SEEK_SET);
 fread(&last,i,4,fin);

//Вместо 1го записываем миним., вместо посл. - макс
  fseek(fin,0L,SEEK_SET);
 fwrite(&minf,1,4,fin);
  fseek(fin,0L,SEEK_SET);
 fwrite(&maxf,i,4,fin);
 
//Вместо мин. запис. первый, вместо макс. - записываем посл
  fseek(fin,0L,SEEK_SET);
 fwrite(&first,min,4,fin);
  fseek(fin,0L,SEEK_SET);
 fwrite(&last,max,4,fin);

 fclose(fin);

 getch(); return 0;
}


К огромному моему сожалению программа работает неверно. На мой сугубо непрофессиональный взгляд, ошибка кроется за горизонт. чертой в коде.

PS: Хотел бы также спросить, где можно достать нормальный конвертер из txt в bin и наоборот, чтоб с выбором типа мона было и т.п.

Заранее благодарю.
320
11 февраля 2007 года
m_Valery
1.0K / / 08.01.2007
Вот решение этой задачи на С++ с STL.
Код:
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    ifstream in("text12.txt",ios::binary);
    if(!in)
     cerr<<"Unable to open text.txt for reading"<<endl;                
     float text;
     vector<float> vec;
     while(in){
        in.read((char*)&text,sizeof(float));
        vec.push_back(text);
       }
     cout<<"The task isn't done"<<endl;
     for(int i = 0;i<vec.size();++i)
        cout<<vec<<"  ";
     vector<float>::iterator it=std::min_element(vec.begin(),vec.end());
        cout<<endl;
        swap(vec[0],*it);
     vector<float>::iterator iter = std::max_element(vec.begin(),vec.end());
        swap(vec[vec.size()-1],*iter);
        cout<<"The Task - is done"<<endl;
     for(int i = 0;i<vec.size();++i)
        cout<<vec<<"  ";
        cout<<endl;
     ofstream out("text1.txt",ios::binary);
        if(!out)
         cerr<<"Unable to open text1.txt for writing.\n";
     for(int i = 0;i<vec.size();++i)
         out<<vec<<'\n';
         cout<<"Writing File!"<<endl;
     return 0;
}
14K
11 февраля 2007 года
demonoide
30 / / 11.02.2007
Уйуйуй... спасибо конечно. Но задачу уже решил.
242
12 февраля 2007 года
Оlga
2.2K / / 04.02.2006
m_Valery, +1 за желание помочь, только на будущее будь внимательней к языку программирования, автор С использует, а не С++.

ЗЫ репутацию добавлю, когда у меня право на это будет, если к тому времени не забуду :)
320
12 февраля 2007 года
m_Valery
1.0K / / 08.01.2007
OlgaKrСпасибо.Я учту по поводу языка.Может кому понадобиться
c STL:)
14K
12 февраля 2007 года
demonoide
30 / / 11.02.2007
Ещё раз благодарствую. Добавил +1 к репутации...

По идее можно тему закрыть [ещё и извенюсь].
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог