Προς το περιεχόμενο

c++ διαβασμα από αρχειο


wolfakisevag

Προτεινόμενες αναρτήσεις

Δημοσ.

παιδια γεια σας έχω ένα προβλημα έχω ένα αρχείο ca.txt με τα παρακάτω δεδομένα:

114\tab\tχανια\tdaklh 120 65490\t2821093156\t234567890

115\tab\tχανιαsvsv\tdaklh 120 65490\t2821093156\t234567890

116\tab\tχανιαv\tdaklh 120 65490\t2821093156\t234567890

τα οποία κάθε ένα είναι κωδικος,ονομα,,πόλη,διευθυνση,τηλέφωνο,αφμ

θέλω αν ξέρει κανείς να μου γράψει συνάρτηση που να κάνει την εξής δουλειά να διαβάζει το αρχείο και να το μεταφέρει σε πίνακα με στοιχεια τυπου comagent.

πιο συγκεκριμένα δεν θέλω να διαβάζει όλο το κείμενο μονομιάς αλλά στοιχείο στοιχείο.

αν γνωρίζει κανείς ας με βοηθήσει μόνο με παράδειγμα κώδικα ευχαριστώ πολύ !

Δημοσ.

Αν και δεν χρησιμοποιώ ιδιαίτερα τις classes της C++ STL για την διαχείριση αρχείων και strings εντούτοις με βάση το ζητούμενο έγραψα τον παρακάτω κώδικα ο οποίος ανοίγει το αρχείο που επιθυμείς (ορίζεται ως παράμετρος του προγράμματος –argv[1]), το διαβάζει γραμμή προς γραμμή (.getline) μέχρι το τέλος του αρχείου (.eof()), κάθε γραμμή την μετατρέπει σε ένα C++ STL String για εύκολη διαχείριση, ύστερα διαβάζει ανά \t (tab) το περιεχόμενο (token) κάθε string / γραμμής (5 tabs) στην μεταβλητή strToken και το εκτυπώνει στην οθόνη. Σε περίπτωση που βρεθεί κενή γραμμή, η ανάγνωση διακόπτεται. Κάθε γραμμή (row) οφείλει να τελειώνει με \t ώστε να διευκολύνεται η ανάγνωση μας ( += ʽ\tʼ). Το μέγεθος κάθε γραμμής ορίζεται σε BUFSIZ, ένα constant του stdio.h που ορίζει μια μεγάλη τιμή (συνήθως 512 χαρακτήρες), το stdio.h συμπεριλαμβάνεται δηλώνεται έμμεσα από τις βιβλιοθήκες της STL. Κάθε φορά που διαβάζουμε (.substr(0, find_first_of(ʽ\tʼ)) το περιεχόμενο της γραμμής μεταξύ της αρχής της –το μηδέν υποδηλώνει την αρχή του string, δηλαδή string[0] κτλ..) και του \t φροντίζουμε να διαγράφουμε ύστερα το περιεχόμενο αυτό (.erase) ώστε η επόμενη κλήση στην .substr να επιστρέψει το περιεχόμενο που ακολουθεί.

 

Για περισσότερες λεπτομέρειες μελέτησε τα comments του κώδικα.

 

>
//-Read Text database (directx)----------------------------------------------
#include <string>
#include <fstream>
#include <iostream>

//	Special pragma (compiler) directives
#ifdef __BORLANDC__
#pragma hdrstop
#endif

//	Special pragma (compiler) directives
#ifdef __BORLANDC__
#pragma argsused
#endif

int main(int argc, char* argv[])
{
//	Create a new fstream for input (read)
std::fstream myStream(argv[1], std::fstream::in );
   //	Is fstream open?
if(!myStream.fail())
 {	
	//	BUFSIZ is defined in stdio.h (a large number)
	char szBuffer[bUFSIZ];
	/*
	 * strRecord will hold each of the database rows (lines),
	 * strToken will hold each of the database row fields (tokens).
	 */
	std::string strRecord,
				strToken;

	//	Redo until end of file
	while(!myStream.eof())
	 {
		//	Read line (\n terminated) from file into szBuffer
		myStream.getline(szBuffer, sizeof(szBuffer));
		//	Store szBuffer char to string for easier manipulation
		strRecord = szBuffer;
		//	Anything to process? (on empty line break!)
		if(!strRecord.length())
			break;
		//	Append trailing TAB character for structure consistency
		strRecord += '\t';

	 	//	Keep record count ...
		static int nRecordCount = 1;
		std::cout << "Record #" << nRecordCount++ << std::endl;

		//	Tokenize each of the 5 fields of strRecord
		for(int nToken = 0; nToken < 5; nToken++)
		 {
			//	Copy each token into strToken (copy from start to first \t)
			strToken = strRecord.substr(0, strRecord.find_first_of('\t'));
			//	Erase each token from strRecord (erase from start to first \t)
			strRecord.erase(0, strRecord.find_first_of('\t') + 1);

			//	Output token
			std::cout << strToken << std::endl;
		 }			

		//	Move stdout output to next record -newline.
		std::cout << std::endl;
	 }

       //	Close file
	myStream.close();
 }
else	//	Something went wrong!!
	std::cout << "Cannot open file for read!" << std::endl;

//	End of program
std::cout << "Press Enter to resume...";
std::cin.get();
return 0;
}
//---------------------------------------------------------------------------

 

ΕΙΣΟΔΟΣ:

>
114	χανια	daklh 120 65490	2821093156	t234567890
115	χανιαsvsv	daklh 120 65490	2821093156	234567890
116	χανιαv	daklh 120 65490	2821093156	234567890

 

ΕΞΟΔΟΣ:

>
Record #1
114
χανια
daklh 120 65490
2821093156
t234567890

Record #2
115
χανιαsvsv
daklh 120 65490
2821093156
234567890

Record #3
116
χανιαv
daklh 120 65490
2821093156
234567890

Press Enter to resume...

 

Υ.Γ.

Θεωρώ ότι το αρχείο διαβάζεται επιτυχώς εκτός και αν προκύψει eof, δεν ελέγχω για επιτυχία ή αστοχία του I/O συστήματος.

 

Χρησιμοποιώ το std:: διότι αισθητικά το προτιμώ, διαφορετικά μπορείς να ορίσεις πριν το main μια using namespace std; εντολή ώστε να εξαλείψεις την χρήση του (αντί για std::cout -> cout κτλ).

 

Το πρόγραμμα δοκιμάστηκε σε CodeGear Turbo C++ Explorer, μπορεί να περιέχει λάθει ή άλλες αβλεψίες.

 

Σαφώς μπορεί να γραφθεί πολύ πιο διαφορετικά ώστε να εξαλειφθεί η ανάγκη για C char, αν και η χρήση του δεν θεωρείται (σε καμία περίπτωση) παράνομη στην C++ STL.

 

Καλή τύχη!

Δημοσ.

[OFFTOPIC]

Χιουμοράκι@Directx: Το παρακάτω

Το πρόγραμμα δοκιμάστηκε σε CodeGear Turbo C++ Explorer, μπορεί να περιέχει λάθει ή άλλες αβλεψίες.

...γιατί δεν το βάζεις ως forum signature; Σήμα κατατεθέν! :-D

[/OFFTOPIC]

Δημοσ.

παιδια ευχαριστώ πολύ αλλά το έλυσα με άλλο τρόπο τα έκανα εισαγωγή από την κλαση πολύ πιο ευκολα από τα προηγούμενα κατεβατά!

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...