Форум » C/C++ для начинающих (C/C++ for beginners) » Ifstream & ofstream » Ответить

Ifstream & ofstream

BasicNewbie: employee.cpp #include "employee.h" void readRecord(Employee *theEmployee , int &size){ ifstream inFile; inFile.open( "employee.txt" ); if( inFile.fail() ) cout << "Unable to obtain Employee Data ! " << endl << "New Database created !" << endl << endl;; if( inFile.is_open() ){ /* while( !inFile.eof() ){ getline( inFile , theEmployee[size].EmployeeID ); getline( inFile , theEmployee[size].EmployeeName ); getline( inFile , theEmployee[size].EmployeeDepartment ); getline( inFile , theEmployee[size].EmployeeDOB ); getline( inFile , theEmployee[size].EmployeeAddress ); inFile >> theEmployee[size].EmployeeWorkHours; inFile >> theEmployee[size].PayRate; inFile >> theEmployee[size].totalSalary; size++; }*/ inFile >> size; inFile.ignore(1, ':'); cout << size ; cin.get(); for (int i = 0 ; i < size ; ++i) { getline( inFile , theEmployee.EmployeeID ); getline( inFile , theEmployee.EmployeeName ); getline( inFile , theEmployee.EmployeeDepartment ); getline( inFile , theEmployee.EmployeeDOB ); getline( inFile , theEmployee.EmployeeAddress ); inFile >> theEmployee.EmployeeWorkHours; inFile >> theEmployee.PayRate; inFile >> theEmployee.totalSalary; inFile.ignore(1,':'); } } } void addRecord(Employee *theEmployee , int &size){ ofstream outFile; /*if( size > 1 ){ size = size - 1; cout<<"Size: "<< size; }*/ cout<<"Size: "<< size; cout << "\nEnter Employee ID [Mix of Char & Integer] : "; cin.ignore(); getline( cin,theEmployee[size].EmployeeID ); cout << "Enter Name : "; getline( cin,theEmployee[size].EmployeeName ); cout << "Enter Employee Department : "; getline( cin,theEmployee[size].EmployeeDepartment ); cout << "Date of birthday [dd/mm/yy] : "; //cin.ignore(); getline( cin,theEmployee[size].EmployeeDOB ); cout << "Enter Address : "; getline( cin,theEmployee[size].EmployeeAddress ); do{ cout << "Enter Work Hour : "; cin >> theEmployee[size].EmployeeWorkHours; if( theEmployee[size].EmployeeWorkHours < 1 ){ cout << "Invalid Input for Work Hours !" << endl; } }while( theEmployee[size].EmployeeWorkHours < 1 ); do{ cout << "Enter Pay Rate : "; cin >> theEmployee[size].PayRate; if( theEmployee[size].PayRate < 1 ) cout << "Invalid Input for Pay Rate !" << endl; }while( theEmployee[size].PayRate < 1 ); theEmployee[size].totalSalary = theEmployee[size].EmployeeWorkHours * theEmployee[size].PayRate ; /*size++; if( size == 0 ){ size++; }*/ outFile.open( "employee.txt" ); size++; outFile << size << "\n" ; for( int i = 0 ; i < size ; i++ ){ outFile << theEmployee.EmployeeID << endl << theEmployee.EmployeeName << endl << theEmployee.EmployeeDepartment << endl << theEmployee.EmployeeDOB << endl << theEmployee.EmployeeAddress << endl << theEmployee.EmployeeWorkHours << endl << theEmployee.PayRate << endl << theEmployee.totalSalary << ':' << endl; } outFile.close(); } void displaySpecificEmployee(Employee *theEmployee , int &size){ string SpecificEmployeeID = ""; int foundIndex = 0; bool found = 0; system( "cls" ); cin.ignore(); cout << "\tSearch a particular employee's payroll " << endl << "-------------------------------------------------------" << endl << endl << "Enter Employee ID : "; getline(cin,SpecificEmployeeID); for( int i = 0 ; i < size ; i++ ){ if( theEmployee.EmployeeID==SpecificEmployeeID ){ found = true; foundIndex = i; } } cout<<"********"<<theEmployee[1].EmployeeID<<"********"<<endl; if( found == true ){ cout << "Employee ID : " << theEmployee[foundIndex].EmployeeID << endl << "Employee Name : " << theEmployee[foundIndex].EmployeeName << endl << "Employee Department : " << theEmployee[foundIndex].EmployeeDepartment << endl << "Employee Date Of Birth : " << theEmployee[foundIndex].EmployeeDOB << endl << "Employee Address : " << theEmployee[foundIndex].EmployeeAddress << endl << "Employee Work Hours : " << theEmployee[foundIndex].EmployeeWorkHours << endl << "Employee Pay Rate : " << theEmployee[foundIndex].PayRate << endl << "Employee Salary : " << theEmployee[foundIndex].totalSalary << endl; } else cout << "No Any Record found ! " << endl; }

Ответов - 18

BasicNewbie: main.cpp #include "employee.h" int main(){ Employee theEmployee[30]; int size = 0; char choice; char choice2; readRecord( theEmployee , size ); cout << "1. Add an employee\n"; cout << "2. View employee record\n"; cout << "3. Modify employee record\n"; cout << "4. Delete Employee record\n"; cout << "5. Press q or Q to Exit\n"; cout << "\nPlease choose an item: "; cin >> choice; switch( choice ){ case '1': addRecord(theEmployee , size); break; case '2': system( "cls" ); cout << "1. Display a particular employee's payroll" << endl << "2. All Employees' payroll" << endl << "3. All Employees' payroll in a particular department" << endl << endl; cout << "Enter Choice : "; cin >> choice2; switch( choice2 ){ case '1': displaySpecificEmployee(theEmployee , size); break; } case 'q': break; case 'Q': cout << "\nProgram will be terminated now!" << endl; getch(); return 0; } system( "pause" ); return 0; }

BasicNewbie1: now my question is.. why inside my data file. while i when i save first record , its perfect. so i keep save file m the error keep come out ( error : alien language ) example my "employee.txt" after i key in 3 record 3 ad123 jye sales 13-10-1991 41,jalan 500 300 150000: ad124 wendy finance 1-5-1993 25 -9.25596e+061 -9.25596e+061: ad125 hsien 12312 123 123 5000 200 1e+006:

Сыроежка: I am sorry but I have not understood the question. Could you repeat it? Also this code is unclear. if( inFile.is_open() ){ /* while( !inFile.eof() ){ getline( inFile , theEmployee[size].EmployeeID ); getline( inFile , theEmployee[size].EmployeeName ); getline( inFile , theEmployee[size].EmployeeDepartment ); getline( inFile , theEmployee[size].EmployeeDOB ); getline( inFile , theEmployee[size].EmployeeAddress ); inFile >> theEmployee[size].EmployeeWorkHours; inFile >> theEmployee[size].PayRate; inFile >> theEmployee[size].totalSalary; size++; }*/ inFile >> size; inFile.ignore(1, ':'); cout << size ; cin.get(); /* Here if I am not wrong size becomes equal to 1500 after reading 3 ad123 jye sales 13-10-1991 41,jalan 500 300 150000: And then you are trying in the loop to read 1501 records are not you? */ for (int i = 0 ; i < size ; ++i) { getline( inFile , theEmployee.EmployeeID ); getline( inFile , theEmployee.EmployeeName ); getline( inFile , theEmployee.EmployeeDepartment ); getline( inFile , theEmployee.EmployeeDOB ); getline( inFile , theEmployee.EmployeeAddress ); inFile >> theEmployee.EmployeeWorkHours; inFile >> theEmployee.PayRate; inFile >> theEmployee.totalSalary; inFile.ignore(1,':'); }


BasicNewbie1: sorry sir ^^ i solve it , by using the outFile.open( "employee.txt" , ios :: out ) <- method hmm , but i not so clear when wan to use the ios :: out . as my question required , it need me to store the file in binary , isn't mean ios ::binary? if i insert the ios :: binary into outFile.open( "employee.txt" , ios :: out || ios :: binary ) inside my textfile will be stick up together with each details , no any endl or spaces between them

Сыроежка: Take into acccount that the following code is also unclear [pre2] switch( choice ){ case '1': addRecord(theEmployee , size); break; case '2': system( "cls" ); cout << "1. Display a particular employee's payroll" << endl << "2. All Employees' payroll" << endl << "3. All Employees' payroll in a particular department" << endl << endl; cout << "Enter Choice : "; cin >> choice2; switch( choice2 ){ case '1': displaySpecificEmployee(theEmployee , size); break; } case 'q': break; case 'Q': cout << "\nProgram will be terminated now!" << endl; getch(); return 0; } [/pre2] In this code snip you have not break for label case 2: of the outer switch statement.

BasicNewbie1: ya i know.. i havent update the code , all having fine now, but in case i wan store the file in binary format . how should i to do? as the question required me to do so.. if i insert ios:: binary into my outfile . i getting some error with it.. all my outfile variable will be stick together how should i to solve it?

Сыроежка: You should use functions read and write for a file used in the binary mode.

BasicNewbie1: u mean using ios :: in || ios :: out || ios :: binary ? use in my outFile? or?

Сыроежка: I mean that if you use the binary mode of a stream then you should use functions read and write. Otherwise in the text mode some data will be interpreted as control symbols.

BasicNewbie1: can provide the example ? sorry ya

Сыроежка: Here is an example of using functions write and read with a binary file stream. [pre2] #include <iostream> #include <fstream> int main() { { const char *fname = "Binary.dat"; std::ofstream fout( fname, std::ios::out | std::ios::binary ); if (!fout ) { std::cout << fname << ": open file error" << std::endl; std::exit( 1 ); } struct { int x; double y; char s[20]; } data = { 10, 15.0, "This is a test" }; fout.write( reinterpret_cast<const char *>( &data ), sizeof( data ) ); } { const char *fname = "Binary.dat"; std::ifstream fin( fname, std::ios::in | std::ios::binary ); if (!fin ) { std::cout << fname << ": open file error" << std::endl; std::exit( 1 ); } struct { int x; double y; char s[20]; } data; fin.read( reinterpret_cast<char *>( &data ), sizeof( data ) ); std::cout << "data.x = " << data.x << ", data.y = " << data.y << ", data.s = " << data.s << std::endl; } return 0; }[/pre2]

BasicNewbie1: i know how the binary should put .. but the problem is when i put ios :: binary . my data inside the txtfile after ofstream . all data will be stick together example : ofstream Outfile; Outfile.open("employee.txt" , ios :: out || ios ::binary ); Outfile << theEmployeeID << theEmployeeName << theEmployeeDOB; if i didn't insert the binary code . my file save properly. after i insert the binary . my file will become like this AD125CHIRSJYE13-10-1991 all data will be stick together . why d?

Сыроежка: No, you are wrong. The same output for character arrays will be if you will not use std::ios::binary. Try for example the following const char *theEmployeeID = "AD125"; const char *theEmployeeName = "CHIRSJYE"; const char *theEmployeeDOB = "13-10-1991" std::cout << theEmployeeID << theEmployeeName << theEmployeeDOB; You will get the same result on the console AD125CHIRSJYE13-10-1991

BasicNewbie1: i tried the code . ya , same result. but then my variable actually not char.. it's string , i using string for all my variable. so why i still get the error result instead ?

Сыроежка: Please show a short example (the shorter the example the better) where you get the error result? And what is the error result?

BasicNewbie1: just a part of my code outFile.open( "employee.txt" , ios:: out || ios :: binary ); size++; outFile << size << "\n" ; for( int i = 0 ; i < size ; i++ ){ outFile << theEmployee.EmployeeID << endl << theEmployee.EmployeeName << endl << theEmployee.EmployeeDepartment << endl << theEmployee.EmployeeDOB << endl << theEmployee.EmployeeAddress << endl << theEmployee.EmployeeWorkHours << endl << theEmployee.PayRate << endl << theEmployee.totalSalary << endl; } outFile.close(); if i do like dis . all my txt data will be stick together . it wont endl after a detail was save it . so get it? but if i remove the ios :: binary everything work fine

Сыроежка: The data are the same except that in the text mode numbers are written as sequence of characters while in the binary mode numbers are written according their internal representations. In the text mode all you data are also stick together. Only when a file is outputed on screen in the text mode new line character has special interpretationthat is after a new line character next data are placed in the next screen line.

BasicNewbie1: so how should i prevent the problem occur??



полная версия страницы