Кальдмееру бы утонуть в море сразу, но даже море его не брало. Море слишком его любило, оно было таким же глупым, как люди.(с)
очередной в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!
у меня есть кусок кода, где 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!
или я неправильно код понял?
хм,из файла он вроде стракт :.. кажется понятно.
а как из файла вытащить этот самый стракт теперь?
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))
Имхо без лишних наворотов и железно.
А можно перегрузить оператор ввода
friend istream& operator >> (istream &s, Person per);
cin>>per.name;
мне надо сравнить то что я получаю с экрана с тем что есть у меня в файле
strcmp == 0 если строки равны. по моему так было
и вообще, каким образом происходит запись этой структуры per в файл? (это главный вопрос)...
Что есть на входе и чего надо добиться?
string - зло, char [] и str*** функции рулят
blin!!!! ya pro nego zabyla
MrXaK Чтобы через fstream структуру в файл пихать, надо знать описание её... это же не Serialize MFCшный
но как теперь прогу заставить запипсывать в файл несколько имен а не одно?!??!!?
Какие все жутко продвинутые-то…
А я, старичок такой, всё на древнющем Borland C++ 5 пишу…
Простите меня, заросшего, что лезу с советами, но хотелось бы разобраться в вопросе.
Итак, как я понял, у тебя есть структура с данными о человеке и файл с кучей элементов данной структуры. Или же в файл ты записывал только имена? Не думаю, что это хорошая идея. Структуры лучше писать в файл целиком и считывать так же. Так. Ты спрашиваешь у юзера имя и сравниваешь его с тем, что лежит в файле. НО что же всё-таки лежит в файле? Если элемент структуры, то не советую считывать куски структуры (имя) отдельно – и результата нормального не получишь и элемент стракта уже считать нормально не сможешь. Делается всё ГОРАЗДО проще:
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!
со всем остальным буду думать завтра....
Это очень верно, т.к. во-первых ты мог просто неправильнно задать цикл (раз у тебя только одна строка записывается), а во-вторых есть 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)
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
// break;
case 4:Print();
break;
}
}
while(choice!=5);
}
хм... по-моему это неправильно... предложу записать так:
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));
вообще я туплю... твой способ записи нормальный...
только вот смотри... ты пишешь какой тип? const CHAR... а char по-умолчанию signed... а при чтении ты что читаешь? unsigned... вот и всё.. или пиши const unsigned char* (хотя не понимаю нафига здесь const) или читай signed...
всё)
з.ы. а вообще всё равно не знаю как работать будет твой код.. я сомневаюсь что массив name[] нормально запишется.. ведь это указатель как-никак...
но как поставить цикл так чтоб в файл записывались все имена, которые я ввожу с консоли?
Пока читал код нашёл много ошибок и неясностей, но уже забыл.
Что ж, вобщем-то тут примерно всё так, как я и предпологал. Будем разбрать по поунктам:
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) .
черт, на счет сорта...я тормоз!