15:40

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



у меня есть кусок кода, где Person per - struct

void Print()

{

Person per;

ifstream f2;

f2.open("student.txt";);

f2.read((unsigned char*)&per,sizeof(Person));

while(!f2.eof())

{

cout<<per.name<<" "<<per.number<<" "<<per.data<<" "<<per.pay<<endl;

}

f2.close();

}



почему-то он не принемает, unsigned :(

help!

Комментарии
23.06.2005 в 16:06

Life is a life... We are the humans...
хм... а каким образом ссылка структуру per должна приводиться к виду указателя на char? и вообще что записано в файле? структура типа per или некоторые строки из которых её надо составить... если структура, то никаких преобразований не нужно... а если текст то нужно знать его формат и потом отдельно уже записывать в структуру...

или я неправильно код понял?
23.06.2005 в 16:12

Какой компилятор, какое описание структуры, зачем вообще unsigned char? :) Мне казалось, что char он беззнаковый и так..
23.06.2005 в 16:53

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

хм,из файла он вроде стракт :.. кажется понятно.

а как из файла вытащить этот самый стракт теперь?
23.06.2005 в 16:59

Life is a life... We are the humans...
по идее преобразовать к типу структуры и всё...
23.06.2005 в 17:08

Кальдмееру бы утонуть в море сразу, но даже море его не брало. Море слишком его любило, оно было таким же глупым, как люди.(с)
мне надо вытащить из файла первую строку и сравнить ее с полученой только что. У меня это похоже на:

void Pay()

{

Person per;

cout<<"Enter name: ";

cin>>per.name;

ifstream f5;

f5.open("student.txt";);

f5.read((char *)&per,sizeof(Person));??????????????

char temp = (char)f5.get(); ?????????????????

cout<<f5.read((char *)&per,sizeof(Person));?????????????

if(strcmp(per.name,temp))

:susp: :shy: :susp: :shy: :help:
23.06.2005 в 17:26

WAAAAAAAAAGH!!!!!!1111ONEONE
вопрос такой: в цикле у тебя идет вывод на экран, но позиция в файле не меняется. он у тебя так и должен бесконечно выводить инфу о одной структуре? И почему нельзя просто инициализировать поля структуры?



Имхо без лишних наворотов и железно.



А можно перегрузить оператор ввода ;-)

friend istream& operator >> (istream &s, Person per);
23.06.2005 в 17:37

Кальдмееру бы утонуть в море сразу, но даже море его не брало. Море слишком его любило, оно было таким же глупым, как люди.(с)
проблема в том что: per.name это то, что программа получает из ввода,

cin>>per.name;

мне надо сравнить то что я получаю с экрана с тем что есть у меня в файле

:weep:
23.06.2005 в 17:40

WAAAAAAAAAGH!!!!!!1111ONEONE
Kalil юзай класс string ;-) Для него перегружены операторы == и != :)

strcmp == 0 если строки равны. по моему так было
23.06.2005 в 17:45

Life is a life... We are the humans...
стоп. а разве запись структуры в файл происходит по типам? разве можно структуру с полем char прочитать обычным вводом строки(к примеру)? читай всю структуру из файла, а потом уже для, к примеру, другого экземпляра структуры вводи с экрана и сравнивай...

и вообще, каким образом происходит запись этой структуры per в файл? (это главный вопрос)...
23.06.2005 в 17:46

Life is a life... We are the humans...
мдя, нифига я по-русски написал.. сам уже не пойму что написал... короче вопрос остаётся... напиши плз код который записывает эту структуру в файл, а потом уже будем разбираться с чтением ))
23.06.2005 в 17:47

Запутали вы друг друга помоему :)))

Что есть на входе и чего надо добиться?

string - зло, char [] и str*** функции рулят
23.06.2005 в 17:49

Кальдмееру бы утонуть в море сразу, но даже море его не брало. Море слишком его любило, оно было таким же глупым, как люди.(с)
f2 >> per.name; дебаг это пропустил но на экран выводит сообщение об ошибке :(

blin!!!! ya pro nego zabyla:susp: :buh: :tear:
23.06.2005 в 17:55

BTW а разве в .NET не убирали потоки? Что-то где-то я такое слышал :)



MrXaK Чтобы через fstream структуру в файл пихать, надо знать описание её... это же не Serialize MFCшный :)
23.06.2005 в 17:57

WAAAAAAAAAGH!!!!!!1111ONEONE
Magir в .NET убрали файлы <iostream.h> и т.п. ашники, оставив только <iostream> и т.п. У нас в VS.NET больше половины группы работает ;-)
23.06.2005 в 18:12

Vj_o-oy вах, извращенцы... GNU C++ Compiler рулит :) ну или VC++ 6...
23.06.2005 в 18:15

WAAAAAAAAAGH!!!!!!1111ONEONE
Magir а когда мелкософт не были извращенцами? MFC один чего стоит...
23.06.2005 в 18:17

Честно говоря MFC меня вполне устраивает :)
23.06.2005 в 18:22

WAAAAAAAAAGH!!!!!!1111ONEONE
Magir помнится пробовал что-то через него сделать, вроде бы и простые опрации, но вышло довольно гиморно. Для виндового программирования удобней C# имхо
23.06.2005 в 18:46

Кальдмееру бы утонуть в море сразу, но даже море его не брало. Море слишком его любило, оно было таким же глупым, как люди.(с)
не надо про микрософт... я его сейчас на мелкие кусочки разорву, в итоге мы решили что можно так f5.getline(line, 25, '\n');...

но как теперь прогу заставить запипсывать в файл несколько имен а не одно?!??!!?
28.06.2005 в 14:35

Абсолютная истина состоит в том, что нет абсолютной истины. (c) Все права защищены
Мда… Хм… Ффф…

Какие все жутко продвинутые-то…

А я, старичок такой, всё на древнющем Borland C++ 5 пишу… :small:



Простите меня, заросшего, что лезу с советами, но хотелось бы разобраться в вопросе.

Итак, как я понял, у тебя есть структура с данными о человеке и файл с кучей элементов данной структуры. Или же в файл ты записывал только имена? Не думаю, что это хорошая идея. Структуры лучше писать в файл целиком и считывать так же. Так. Ты спрашиваешь у юзера имя и сравниваешь его с тем, что лежит в файле. НО что же всё-таки лежит в файле? Если элемент структуры, то не советую считывать куски структуры (имя) отдельно – и результата нормального не получишь и элемент стракта уже считать нормально не сможешь. Делается всё ГОРАЗДО проще:



Person temp_p; /*создаём временный элемент стракта*/

f5>>temp_p; /*считываем туда весь элемент из файла*/

/*а дальше просто*/

if(strcmp(per.name,temp_p.name)==0)

{

/*бла-бла-бла*/

}



Если же у тебя в файле одни строки, тогда всё это чуть посложнее. В этом случее почему у тебя sizeof(Person), а не sizeof(char)? И ещё: у тебя написано:

char temp = (char)f5.get();

Ты собираешься только одну букву записывать в temp? 8) Если нет, напиши temp[]. И ещё, strcmp действительно возвращает 0 когда строки одинаковые, поэтому напиши

if(strcmp(per.name,temp_p.name)==0)

Или хотя бы

if(!strcmp(per.name,temp_p.name))



Несколько имён (а лучше элементов) желательно записывать сразу, отдельной функцией, т.к. дозапись вполне может глючить.



Кажись всё так. А вообще любые базы данных я всегда делаю так: делаю класс (прим.: class data) для одной записи и класс для всей базы (прим.: class base), в котором есть много элементов data (или система указателей) и методы для добавления, поиска, сохранения в файл базы и соотв. загрузки из файла. Эта схема работает в 90% случеев.



З.Ы.: char* и string mustdie, char[] 4ever! :pozit: :gigi:
28.06.2005 в 16:07

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

со всем остальным буду думать завтра....
28.06.2005 в 19:31

Life is a life... We are the humans...
Kalil можешь всё-таки привести код записи твоей структуры в файл? у меня одно подозрение есть )
29.06.2005 в 09:45

Абсолютная истина состоит в том, что нет абсолютной истины. (c) Все права защищены
Kalil можешь всё-таки привести код записи твоей структуры в файл? у меня одно подозрение есть )

Это очень верно, т.к. во-первых ты мог просто неправильнно задать цикл (раз у тебя только одна строка записывается), а во-вторых есть 2 способа правильно записать и загрузить стрктуру: либо структуру целиком, примерно так:

f5<<per; /*хотя точно не помню 8)*/

НО в этом случее ты не должен открывать/создавать файл так:

f5.open("student.txt";);

Это неверно, надо прибавить индификатор:

f5.open("student.txt",ios::binary);

Кажется так (сам этим редко пользуюсь).

Либо с обычным открытием записывай/считывай каждую переменную в структуре, наверно так:

f5<<per.name; f5<<per.number; /*...*/

f5>>per2.name; f5>>per2.number; /*...*/



Вотъ. А вообще лучше почитай насчёт этого какую-нить книжку или выложи сюда весь код и задачу, может я попробую чего-нить написать. 8)
29.06.2005 в 11:39

Кальдмееру бы утонуть в море сразу, но даже море его не брало. Море слишком его любило, оно было таким же глупым, как люди.(с)
kod vyglyadit tak, menya sejchas net, no chut' popozzhe budu dumat' :)

naschet cikla vy skoree vsego pravy:

#include <iostream>

#include <fstream>

#include <string.h>

using namespace std;

struct Person

{

public:

char name[25];

int number;

int data;

bool pay ;

};

//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

int WrightNewName(int n)

{

char q;

do

{

Person per;

ofstream f1("student.txt",ios::ate);

///f1.open("student.txt";);

int j;

cout<<"Enter new name: ";

cin>>per.name;

cout<<"Enter number teudat zeut: ";

cin>>per.number;

cout<<"Enter data today: ";

cin>>per.data;

cout<<"Enter pay or not: 1-true, 0 - false ";

cin>>j;

if(j==1)

{

per.pay = true;

cout<<"The per.pay = true " << per.pay;

}

else if (j==0)

{ per.pay = false;

cout<<"The per.pay = false "<< per.pay;

}

n++;

// Sort(Person,n);

///while(!f1.eof());

f1.write((const char*)&per,sizeof(Person));

f1.close();

return n;

}

while(!q);

}

//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

/*void Sort(Person,int *n)

{

Person per;

ifstream f3;

ofstream f4;

f3.open( "student.txt";);

f3.read((unsigned char*)&per,sizeof(Person));

while(!f3.eof())

{

for (int i=0; i<n;i++)

{

if (strcmp(per[i].name, per(i+1).name) < 0) // NADO POMENAT

{



char temp[30];

int temp1;

bool temp2;

strcpy(temp, per(i).name);

strcpy(per[i].name, per[i+1].name);

strcpy(per[i+1].name, temp);

strcpy(temp, per[i].number);

strcpy(workers[i].number, per[i+1].number);

strcpy(per[i+1].number, temp);

temp1=per[i].data;

per[i].data = per[i+1].data;

per[i+1].data = temp;

temp2=per[i].pay;

per[i].pay = per[i+1].pay;

per[i+1].pay = temp;

}

}

f3.close();

f4.open("student.txt";);

f4.write((unsigned char*)&per,sizeof(Person))

f4.close();*/

//***************************************************************

void Pay()

{

Person per;

cout<<"Enter name: ";

cin>>per.name;

ifstream f5;

f5.open("student.txt";);

char line[25];

bool d;

//---------------------------------------

f5.getline(line, 25, '\n');// Zu!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

//----------------------------------------

if((strcmp(line,per.name))==0)

{

cout<<"per.pay"<< per.pay<<endl;

if (per.pay==true)

{

cout<<"Yes, this girl pay"<<endl;

}

else

{

cout<<"No, this girl did not."<<endl;

}

}

}

//*************************************************************

/* void Clear(int n)

{

Person per[n];

if(per.pay==false)

{

per[n].name=per[n+1].name;

per[n].data=per[n+1].data;

per[n].pay=per[n+1].pay;

per[n].number=per[n+1].number;

}

}*/

//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

void Print()

{

Person per;

ifstream f2;

f2.open("student.txt";);

f2.read((char*)&per,sizeof(Person));

while(!f2.eof())

{

cout<<per.name<<" "<<per.number<<" "<<per.data<<" "<<per.pay<<endl;

f2.read((char*)&per,sizeof(Person));

}

f2.close();

}

//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

void main()

{

int choice;

int n=0;

do

{

cout<<"Choose an option:"<<endl;

cout<<"1 - to add a new name"<<endl;

cout<<"2 - pay to learn: 0 - true, 1 - false."<<endl;

cout<<"3 - delet all students, how did not pay."<<endl;

cout<<"4 - print all students."<<endl;

cout<<"5 - Exit."<<endl;

cin>>choice;

switch(choice)

{

case 1: WrightNewName(n);

break;

case 2:Pay();

break;

// case 3:Delet();

// break;

case 4:Print();

break;

}

}

while(choice!=5);



}
29.06.2005 в 11:45

WAAAAAAAAAGH!!!!!!1111ONEONE
тз бы кинул к сорцам ;-)
29.06.2005 в 12:15

Life is a life... We are the humans...
f1.write((const char*)&per,sizeof(Person));

хм... по-моему это неправильно... предложу записать так:



Person per;

//....

memset(&per, 0, sizeof(Person));

int fh = _open("file.dat",_O_RDWR | _O_BINARY);

_lseek(fh,0,SEEK_END);

_write(fh,&per,sizeof(Person));



Читать соответственно:

_read(fh,&per,sizeof(Person));
29.06.2005 в 13:46

Life is a life... We are the humans...
f1.write((const char*)&per,sizeof(Person));

вообще я туплю... твой способ записи нормальный...

только вот смотри... ты пишешь какой тип? const CHAR... а char по-умолчанию signed... а при чтении ты что читаешь? unsigned... вот и всё.. или пиши const unsigned char* (хотя не понимаю нафига здесь const) или читай signed...

всё)

з.ы. а вообще всё равно не знаю как работать будет твой код.. я сомневаюсь что массив name[] нормально запишется.. ведь это указатель как-никак...
29.06.2005 в 17:18

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

но как поставить цикл так чтоб в файл записывались все имена, которые я ввожу с консоли?
29.06.2005 в 18:01

Абсолютная истина состоит в том, что нет абсолютной истины. (c) Все права защищены
Мдааа...

Пока читал код нашёл много ошибок и неясностей, но уже забыл. :-(

Что ж, вобщем-то тут примерно всё так, как я и предпологал. Будем разбрать по поунктам:

1. Вообще структуру зря ты использовал, классом всё было бы в разы удобнее.

2. Общая форма общения базы данных с файлом не очень удачна. Слишком много мест, где может возникнуть ошибка. ГОРАЗДО лучше было бы, если был бы класс, имеющий в себе массив структур Person, который и надо было бы полностью сохранять/загружать.

3. do...while ИМХО mustdie. Оччень неудачная для С++ конструкция. Да и ненужная.

4. // Sort(Person,n); - даже если раскомментишь, работать не будет - объявление функции Sort идёт позже. Советую объявлять все функции заранее, дабы избежать таких вот глюков.

5. while(choice!=5); - отрицательно отношусь к такой конструкции. Лучше подключи <windows.h> и используй

case 5: exit(0);

6. Ну, и самая большая фигня: зачем ты записываешь в файл куски структуры? Записывай целиком и читай целиком! Допиши для этого ios::binary ко всем открытиям файла. И не парься! Проблемы с именами и char'ами отпадут сами собой!



Короче, завтра возьму этот код, починю его и выложу сюда. Сегодня не могу - 6 часов, рабочий день кончился 8) .
29.06.2005 в 18:38

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

черт, на счет сорта...я тормоз!