Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.06.2009, 20:20   #1
StudentPolitech
Форумчанин
 
Аватар для StudentPolitech
 
Регистрация: 21.11.2008
Сообщений: 400
По умолчанию произвольный доступ к файлам

Написал программу компилируется работает но результаты странные выводит)) Вроде из памяти ничего лишнего не хватаю, но никак не отловлю ошибку, помогите пожалуйста кто может, заранее благодарю.
Красным у меня выделен метод пузырьковой сортировки с помощью которой я сортирую студентов по оценкам, по убыванию.
Код:
#include<iostream.h>
#include<conio.h>
#include <fstream.h>

struct proga
{
int nomer;
int ocenka;
char familia[10];
};
proga a;
proga b;
proga c;
int main()
{
clrscr();
ofstream f1("a.bar",ios::binary);
int kol=0;
for(int i=1; i<=10; i++)
{
kol=kol++;
cout<<kol<<" "<<"student"<<endl;
//cout<<"Vvedite nomer"<<endl;
a.nomer=kol;
cout<<"Vvedite familiy"<<endl;
cin>>a.familia;
cout<<"Vvedite ocenky"<<endl;
cin>>a.ocenka;
clrscr();
f1.write((char *) &a, sizeof (a));}
f1.close();

ifstream f2("a.bar",ios::binary);

for( i=1;i<=10;i++)
{
f2.read((char*) &a, sizeof( a));
cout<<"Nomer "<<a.nomer<<endl;
cout<<"Familia "<<a.familia<<endl;
cout<<"Ocenka "<<a.ocenka<<endl;
cout<<endl;
}
f2.close();
getch();
clrscr();


ifstream f3("a.bar", ios::ate |ios::in | ios::binary);
ofstream f4("a.bar", ios::ate| ios:ut| ios::binary);



for(int j=0; j<9; j++)
{
f3.open("a.bar", ios::ate | ios::binary);
f4.open("a.bar", ios::ate| ios::binary);
//f3.seekg(0);
//f4.seekp(0);
for(i=0;i<9; i++)
{
f3.seekg((i)*sizeof(a));
f3.read((char*) &a, sizeof a);
f3.read((char*) &b, sizeof b);
if(a.ocenka<b.ocenka)
{
c.nomer=a.nomer;
for(int k=0;k<10;k++) {
c.familia[k]=a.familia[k]; }
c.ocenka=a.ocenka;

a.nomer=b.nomer;
for(k=0;k<10;k++)
{
a.familia[k]=b.familia[k];
}
a.ocenka=b.ocenka;
b.nomer=c.nomer;
for( k=0;k<10;k++){
b.familia[k]=c.familia[k]; }
b.ocenka=c.ocenka;
}
//f3.seekg((i)*sizeof(a));
f4.seekp((i)*sizeof(a));
f4.write((char *) &a, sizeof(a));
f4.write((char *) &b, sizeof(b));
}
//f3.seekg(0);
//f4.seekp(0);
f3.close();
f4.close();
}

cout<<"sortirovka okonchena"<<endl;
getch();
clrscr();
f2.open("a.bar",ios::binary);
for( i=0;i<10;i++)
{
f2.read((char*) &a, sizeof(a));
//f2.seekg(0);
//if(f2.eof()){cout<<"file pustoy"<<endl; getch();clrscr(); return 0;}

cout<<"Nomer "<<a.nomer<<endl;
cout<<"Familia "<<a.familia<<endl;
cout<<"Ocenka "<<a.ocenka<<endl;
cout<<endl;
}
f2.close();
getch();

return 0;
}
Модератор: тег CODE
Винда, KIS 2010, книжка по С/С++, остальное неважно........

Последний раз редактировалось Sazary; 04.06.2009 в 20:51.
StudentPolitech вне форума Ответить с цитированием
Старый 04.06.2009, 22:14   #2
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

А что оно делать-то должно?
Из того, что успел заметить: у вас локальные переменные используются и дальше в программе (после того, как уже перестанут существовать). Это касается практически всех циклов. Или сделайте их глобальными, или объявляйте каждый раз в циклах.

Если программе нужен какой-то исходный файл (с данными, которые он считывает), то приложите его.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 04.06.2009, 22:57   #3
ROD
Linux C++ Qt ARM
Старожил
 
Аватар для ROD
 
Регистрация: 30.11.2008
Сообщений: 3,030
По умолчанию

Нет. "Данный файл" программа создает сама. (ну это тут не столь важно).

Вот выражаю мысль по нормальному.

Дан файл. В файле записанны структуры
struct student
Код:
{
int nomer;
int ocenka;
char familia[10];
};
В файле таких структур 10(десять).

Необходимо отсортировать студентов по убыванию их оценки (5,4,3,2,1).
Целиком считывать файл в оперативку нельзя.


Проьблема возникает в функции сортировки. В результате в файле оказывается черт знает что.

Вот программа, которую мы, вместе с моим коллегой, составили:

Код:
#include <iostream.h>
#include <conio.h>
#include <fstream.h>

struct proga//это структура, типа "студент"
{
int nomer;
int ocenka;
char familia[10];
};
proga a;
proga b;
proga c;
int main()
{
clrscr();
ofstream f1("a.bar",ios::binary);
int kol=0;//файл, который "дан" создаем и заполняем тут.
for(int i=1; i<=10; i++)
{
kol=kol++;
cout<<kol<<" "<<"student"<<endl;
//cout<<"Vvedite nomer"<<endl;
a.nomer=kol;
cout<<"Vvedite familiy"<<endl;
cin>>a.familia;
cout<<"Vvedite ocenky"<<endl;
cin>>a.ocenka;
clrscr();
f1.write((char *) &a, sizeof (a));}
f1.close();

ifstream f2("a.bar",ios::binary);//выводим его

for(int i=1;i<=10;i++)
{
f2.read((char*) &a, sizeof( a));
cout<<"Nomer "<<a.nomer<<endl;
cout<<"Familia "<<a.familia<<endl;
cout<<"Ocenka "<<a.ocenka<<endl;
cout<<endl;
}
f2.close();
getch();
clrscr();

//начинаем сортировку по убыванию
ifstream f3("a.bar", ios::ate |ios::in | ios::binary);
ofstream f4("a.bar", ios::ate| ios::out| ios::binary);


for(int j=0; j<9; j++)
	{

	for(int i=0;i<9; i++)
		{
		f3.seekg((i)*sizeof(a), ios::beg);
		f3.read((char*) &a, sizeof a);
		f3.read((char*) &b, sizeof b);
		if(a.ocenka<b.ocenka)
		{
		c.nomer=a.nomer;
		for(int k=0;k<10;k++)
      	{
			c.familia[k]=a.familia[k];
         }
      c.ocenka=a.ocenka;
		a.nomer=b.nomer;
		for(int k=0;k<10;k++)
			{
			a.familia[k]=b.familia[k];
			}
		a.ocenka=b.ocenka;
   	b.nomer=c.nomer;
      for(int k=0;k<10;k++)
      	{
			b.familia[k]=c.familia[k];
         }
		b.ocenka=c.ocenka;
		}
   f3.seekg(i*sizeof(a), ios::beg);
	f4.seekp(i*sizeof(a), ios::beg);
	f4.write((char *) &a, sizeof(a));
	f4.write((char *) &b, sizeof(b));
	}
	f3.seekg(0, ios::beg);
	f4.seekp(0, ios::beg);
	}
f3.close();
f4.close();

cout<<"sortirovka okonchena"<<endl;
//ну а дальше выводим все на экран, и видим не верные результаты.
getch();
clrscr();
f2.open("a.bar",ios::binary);
for(int i=0;i<10;i++)
{
f2.read((char*) &a, sizeof(a));
f2.seekg(0);
if(f2.eof()){cout<<"file pustoy"<<endl; getch();clrscr(); return 0;}

cout<<"Nomer "<<a.nomer<<endl;
cout<<"Familia "<<a.familia<<endl;
cout<<"Ocenka "<<a.ocenka<<endl;
cout<<endl;
}
f2.close();
getch();

return 0;
 }
[offtop]Только тема задания, не ввод-вывод, а , скорее, произвольный доступ.[/offtop]
Дилетант широкого профиля.

"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс

Последний раз редактировалось ROD; 04.06.2009 в 23:03.
ROD вне форума Ответить с цитированием
Старый 05.06.2009, 00:33   #4
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Все исправил. Многое переделал. Думаю, разберетесь.
Вывод тоже немного поменял (старый закомментил), чтобы было лучше видно при тесте.

Код:
#include <iostream.h>
#include <conio.h>
#include <fstream.h>

struct proga//это структура, типа "студент"
{
int nomer;
int ocenka;
char familia[10];
};

const int N=4;

int main()
{
proga a,b;
fstream f;
f.open("a.bar",ios::binary|ios::out);
int kol=0;//файл, который "дан" создаем и заполняем тут.
for(int i=0; i<N; i++)
{
 kol++;
 cout<<kol<<" "<<"student"<<endl;
 a.nomer=kol;
 cout<<"Vvedite familiy"<<endl;
 _flushall();
 cin.getline(a.familia,10,'\n');
 cout<<"Vvedite ocenky"<<endl;
 cin>>a.ocenka;
 
 f.seekp(i*sizeof(struct proga),ios::beg);
 f.write((char*)&a, sizeof(struct proga));
 }
f.close();

f.open("a.bar",ios::binary|ios::in);//выводим его

cout<<"\n------------------------------\n\n";
for(int i=0;i<N;i++)
{
f.seekg(i*sizeof(struct proga),ios::beg);
f.read((char*)&a, sizeof(struct proga));
//cout<<"Nomer "<<a.nomer<<endl;
//cout<<"Familia "<<a.familia<<endl;
//cout<<"Ocenka "<<a.ocenka<<endl;
//cout<<endl;
cout<<a.nomer<<"\t"<<a.familia<<"\t"<<a.ocenka<<endl;
}
f.close();

getch();
cout<<"\n=====================\n\n";

cout<<endl;
//начинаем сортировку по убыванию

f.open("a.bar", ios::in | ios::out| ios::binary);

int k;
int tmp;
proga c;
for(int i=0; i<N-1; i++)
	{
 f.seekg(i*sizeof(struct proga),ios::beg);
 f.read((char*)&a, sizeof(struct proga)); 
	k = i;
 c = a;
 for(int j=i+1;j<N; j++)
		{  
		 f.seekg(j*sizeof(struct proga),ios::beg);
		 f.read((char*)&b,sizeof(struct proga));
   if(b.ocenka>c.ocenka) 
   {
    k = j;
    c = b;
   }
  }
		if(k!=i)
		 {
    f.seekp(i*sizeof(struct proga),ios::beg);
    f.write((char*)&c,sizeof(struct proga));
    f.seekp(k*sizeof(struct proga),ios::beg);
    f.write((char*)&a,sizeof(struct proga));
   }	
  
	}
f.close();


cout<<"sortirovka okonchena"<<endl;

getch();


f.open("a.bar",ios::binary|ios::in);
for(int i=0;i<N;i++)
{
 f.seekg(i*sizeof(struct proga),ios::beg);
 f.read((char*)&a, sizeof(struct proga));

//cout<<"Nomer "<<a.nomer<<endl;
//cout<<"Familia "<<a.familia<<endl;
//cout<<"Ocenka "<<a.ocenka<<endl;
 cout<<a.nomer<<"\t"<<a.familia<<"\t"<<a.ocenka<<endl;
 }
f.close();

getch();

return 0;
}
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 05.06.2009, 00:43   #5
ROD
Linux C++ Qt ARM
Старожил
 
Аватар для ROD
 
Регистрация: 30.11.2008
Сообщений: 3,030
По умолчанию

Цитата:
sizeof(struct proga)
Вопрос по поводу этой записи. Почему нельзя написать просто sizeof(proga) ?

P.S.

К стати, вывод красиво сделан.
Дилетант широкого профиля.

"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс
ROD вне форума Ответить с цитированием
Старый 05.06.2009, 00:46   #6
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
Сообщение от ROD
Почему нельзя написать просто sizeof(proga) ?
Можно Но так более...наглядно что-ли.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 06.06.2009, 14:15   #7
StudentPolitech
Форумчанин
 
Аватар для StudentPolitech
 
Регистрация: 21.11.2008
Сообщений: 400
По умолчанию

Извините вопрос зачем вот это _flushall(); если можно было просто написать cin>>familia;
Винда, KIS 2010, книжка по С/С++, остальное неважно........
StudentPolitech вне форума Ответить с цитированием
Старый 06.06.2009, 14:28   #8
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

_flushall() - очистка буферов.
В принципе, можете и так написать..
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Доступ к файлам za4ot Работа с сетью в Delphi 1 22.01.2009 15:31
Новый троян блокирует доступ к файлам на жестком диске mihali4 Безопасность, Шифрование 3 23.12.2008 20:04
произвольный выбор из констант Arhangel_bes Помощь студентам 11 12.10.2008 22:07
доступ к файлам ryton Общие вопросы Delphi 13 23.05.2008 14:15