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

Input/Output from File


planelover

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

Δημοσ.

Την καλησπέρα μου σε όλους,

 

Είμαι καινούριος στον προγραμματισμό (C++) και έχω μια απορία για ένα πρόγραμμα που θέλω να φτιάξω...: Θέλω ένα πρόγραμμα που να διαβάζει κάτι από ένα .txt, να το αποθηκεύει στη μνημη και κατόπιν να τυπώνει στο τέλος του .txt τον αριθμό, που έχει ήδη διαβάσει, αυξημένο κατά 1. Για παράδειγμα, στο txt έχω ενότητες που λέγονται: "[fltsim.1], [fltsim.2]" κλπ. Αυτό που θέλω να κάνω εγώ είναι να διαβάσω ποιο είναι το τελευταίο νούμερο (στην προκειμένη περίπτωση το 2) και να τυπώσει από κάτω "[fltsim.x+1]" όπου x=ο τελευταίος αριθμός.

 

Ευχαριστώ εκ των προτέρων!

Δημοσ.

Νομίζω ότι αυτό βοηθάει. Βλέπεις ποιές μεθόδους θα χρειαστείς, μάλλον θα πρέπει να δουλέψεις και με Regular Expressions για να βρεις το String που θες και μετά για να γράψεις στο τέλος του αρχείου είναι εύκολο.

 

Ελπίζω να μη λέω βλακείες γιατί δεν ασχολούμαι με C++, απλά σαν ιδέα μου φαίνεται σωστή. Anyway, καλή τύχη.

Δημοσ.
Την καλησπέρα μου σε όλους,

 

Είμαι καινούριος στον προγραμματισμό (C++) και έχω μια απορία για ένα πρόγραμμα που θέλω να φτιάξω...: Θέλω ένα πρόγραμμα που να διαβάζει κάτι από ένα .txt, να το αποθηκεύει στη μνημη και κατόπιν να τυπώνει στο τέλος του .txt τον αριθμό, που έχει ήδη διαβάσει, αυξημένο κατά 1. Για παράδειγμα, στο txt έχω ενότητες που λέγονται: "[fltsim.1], [fltsim.2]" κλπ. Αυτό που θέλω να κάνω εγώ είναι να διαβάσω ποιο είναι το τελευταίο νούμερο (στην προκειμένη περίπτωση το 2) και να τυπώσει από κάτω "[fltsim.x+1]" όπου x=ο τελευταίος αριθμός.

 

Ευχαριστώ εκ των προτέρων!

 

Μπορείς να διαβάσεις κάθε γραμμή του αρχείου κειμένου με την βοήθεια της ifstream.getline. Όταν διαβάζεις μια γραμμή που έχει ικανό μέγεθος (για παράδειγμα μεγαλύτερο από 4 χαρακτήρες), ξεκινά (at) με τον χαρακτήρα [ και τελειώνει με τον χαρακτήρα ] και περιέχει τον χαρακτήρα (find) . αμέσως μετά τον χαρακτήρα [ και πριν τον χαρακτήρα ] έχοντας δίπλα από το . έναν αριθμητικό χαρακτήρα (0 ως 9) μπορείς να θεωρείς ότι πρόκειται για την τελευταία ενότητα αποθηκεύοντας την σε μια μεταβλητή string (strLastSection). Μόλις διαβάσεις όλες τις γραμμές του αρχείου (while) και εφόσον η μεταβλητή αυτή περιέχει κάποιες πιθανόν χρήσιμες πληροφορίες μπορείς με την βοήθεια των rfind & find να εντοπίσεις το που ακριβός αρχίζει και τελειώνει ο αριθμός της ενότητας μέσα στην γραμμή ώστε να τον αντιγράψεις (copy) σε μια άλλη μεταβλητή κειμένου (char szLine). Ύστερα αφού εξασφαλίσεις ότι ο αριθμός είναι καθαρός, δηλαδή δεν περιέχει μη αριθμητικούς χαρακτήρες, μπορείς με την βοήθεια της istringstream να τον μετατρέψεις σε Integer ώστε τελικά να τον αυξήσεις και να εκτυπώσεις την νέα ενότητα.

 

>
//-Read File & Calculate new Header value (c) directx------------------------
#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
#include <locale>
#ifdef __BORLANDC__
#pragma hdrstop
#endif

//---------------------------------------------------------------------------
using namespace std;

#ifdef __BORLANDC__
#pragma argsused
#endif
int main(int argc, char* argv[])
{
if(argc == 1)
	cout << "No input file specified!" << endl;
else
 {
	// Open file for read
	ifstream File(argv[1]);

	if(File.is_open())
	 {
           int	nLastSection = 0;
		char szLine[bUFSIZ];
		string strLastSection;

		// Read each line to szLine
		while((File.getline(szLine, sizeof(szLine))))
		 {
			  // Convert char Line to C++ string Line
			  string strLine = szLine;

			  // Keep Last valid line ([ & ]) stored to strLastSection
			  if(strLine.length() > 4
			  && strLine.at(0) == '['
			  && strLine.at(strLine.length() - 1) == ']')
			   {
					// Valid line should have a dot and after that a number .123 ..
					if(strLine.find(".", 0) > 0
					&& strLine.find(".", 0) < strLine.at(strLine.length() - 1)
					&& isdigit(strLine.at(strLine.find(".", 0) + 1)))
					 {
						// Copy LastSection number to nLastSection
						cout << (strLastSection = szLine) << endl;
					 }
			   }
		 }

		 // Process LastSection number (find it, increase it, print it)
		 if(strLastSection.length() > 4)
		  {
			 int nDotPos = strLastSection.rfind(".", strLastSection.length()),
				 nBracketPos = strLastSection.rfind("]", strLastSection.length());

			 // Clear szLine because copy does not include a \0 to destination
			 memset(&szLine, 0, sizeof(szLine));
			 strLastSection.copy(szLine, (nBracketPos - 1) - nDotPos, nDotPos + 1);

			 // Accept only numbers eg ".123]" instead of ".123a]" etc..
			 for(int nCharCount = 0; nCharCount < strlen(szLine); nCharCount++)
				if(!isdigit(szLine[nCharCount]))
				 {
                       File.close();
					cout << "Type mismatch because of \"" + (string)szLine + "\"";
					return 1;
				 }

			 // Convert String to Integer with the help of istringstream class
			 istringstream	iStream(szLine);
			 iStream >> nLastSection;

			 // Print new header with increased number
			 cout << "New Section:" << endl << "\t[fltsim." << nLastSection + 1 << "]" << endl;
		  }

		File.close();
	 }
	else
		cout << "Cannot open file " << argv[1] << endl;
 }

return 0;
}
//---------------------------------------------------------------------------

 

Είσοδος:

 

>
[fltsim.1]
THIS IS FLTSIM1

[fltsim.2]
THIS IS FLTSIM2

[fltsim.3]
THIS IS FLTSIM3

[fltsim.4]
THIS IS FLTSIM4

 

Έξοδος:

 

>
[fltsim.1]
[fltsim.2]
[fltsim.3]
[fltsim.4]
New Section:
       [fltsim.5]

 

Σημείωση: Μπορείς να μετατρέψεις άμεσα ένα κείμενο σε αριθμό με την βοήθεια της istringstream ακόμα και αν το κείμενο περιέχει και μη αριθμητικούς χαρακτήρες (για παράδειγμα 1234αβγ) σε αυτή την περίπτωση όμως η μετατροπή θα διακοπή στον πρώτο μη αριθμητικό χαρακτήρα (1234αβγ -> 1234 ή 1α234 -> 1) δίχως να παρουσιασθεί κάποιο σφάλμα από την istringstream, για αυτό προτιμώ να κάνω έναν έλεγχο στο κείμενο που προορίζεται για αριθμός ώστε να εξασφαλίσω πως δεν περιέχει μη αριθμητικούς χαρακτήρες –σε περίπτωση τέτοια προτιμώ να σταματά με υπόδειξη λάθους παρά να συνεχίζει ακάθεκτο σε άλλες ενότητες (για αυτό ο έλεγχος είναι εκτός του while).

 

Το πρόγραμμα ψάχνει απλά για κεφαλίδες τύπου [.N] ( > 4 ) δεν περιλαμβάνει έλεγχο για [fltsim.N].

 

Το πρόγραμμα γράφτηκε σε ET/CodeGear C++ Builder, μπορεί να περιέχει σφάλματα ή άλλες αβλεψίες. Επίσης δεν εγγυώμαι για την λειτουργία του σε άλλους C++ compilers.

 

Καλή τύχη.

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

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

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