17. juni 2005 - 16:53
Der er
18 kommentarer og 1 løsning
Find Forrige Linje i InputFil
Hej! Jeg sidder og laver et projekt hvor der skal indlæses fra en fil, det går fint nok med. fstream og getFile(Buffer, sizeof(Buffer) mit spørgsmål er så, at når jeg har fundet ud af det jeg indlæste skal foresage en anden handling end den påbegyndte og jeg så ønsker at flytter min pointer tilbage i filen, hvordan gør jeg dette! Jeg har forsøgt mig med en for loop som laver en "unget()" af den seneste karakter! det virker ikke rigtigt efter min menning, da jeg kan se at næste gang jeg læser linjen ind, så mangler der en masse " " void ReverseLine(fstream *inFile, char *Buffer) { for(int i = 0; i < (int)strlen(Buffer); i++) inFile->unget(); Buffer[0] = 0; }
Annonceindlæg fra DE-CIX
det man normal gør i den situation er: forrige linie = læs linie while not eof { linie = læs linie hvis linie opfylder betingelserne { process forrige linie } forrige linie = linie } hvis linie opfylder betingelserne { process forrige linie }
ovenstående er pseudo kode - jeg kan godt lave et C++ eksempel hvis nødvendigt
ja, tak! det ville være rart! for jeg har ikke nogen ide om hvordan jeg skal få den til at fungere ordentligt!
her kommer et eksempel vi har en input fil a b c * e f * g vi skal indlæse den og udskrive alle linier undtagen dem med * og dem der er lige før en linie med * kode #include <iostream> #include <fstream> #include <string> using namespace std; int main() { ifstream f("test.txt"); string line,lastline; lastline = "*"; while(f && !f.eof()) { getline(f,line); if(line != "*" && lastline != "*") { cout << lastline << endl; } lastline = line; } if(lastline != "*") { cout << lastline << endl; } f.close(); return 0; } og korrekt output a b e g
okay! jeg har nok ikke udtrykt mig klart nok! Jeg sender lige et stykke kode while(!inFile->eof()) { if(first) { inFile->ignore(6); inFile->getline(Buffer, sizeof(Buffer)); } int t = strcspn(Buffer, "0"); if(strncmp(Buffer, "* START OF IMPORT", 17) == 0 || strncmp(Buffer, "* START OF EXPORT", 17) == 0 || GetInProcess()) { if(first) { inFile->getline(Buffer, sizeof(Buffer)); inFile->getline(Buffer, sizeof(Buffer)); inFile->getline(Buffer, sizeof(Buffer)); SetInProcess(true); } while(strncmp(Buffer, "* * *", 5) != 0) { if(GetInProcess()) { inFile->ignore(6); inFile->getline(Buffer, sizeof(Buffer)); } else break; if(GetRG() && Buffer[strlen(Buffer)-2] == 'G' && Buffer[strlen(Buffer)-3] == 'R') { level = strcspn(Buffer, "0"); ReverseLine(inFile, Buffer); break; } ...... Den linje jeg får læst ind, vil jeg gerne kunne læse ind igen næsten gang løkke når til GetLine(Buffer, sizeof(Buffer)), det er det som er mit problem
og jeg mener stadigvæk at det korrekte approach er at have den forrige linie gemt så man bare kan finde den frem igen i.s.f. at læse den ind igen
det er selvføgelig en mulighed! Men hvordan vil den så fungerer når jeg ønsker at læse nogle flere linjer ind bagefter. Hvor står pointeren så?
så læser du ind og så står du der hvor du er kommet til
jeg tror sagtens at vi kan flytte den pointer tilbage, men det er efter min bedste overbevisning ikke den rigtige måde at gøre det på
17. juni 2005 - 20:56
#10
hvis vi tager dit eksempel! hvordan får jeg så skrevet c og f ud!
17. juni 2005 - 21:19
#11
#include <iostream> #include <fstream> #include <string> using namespace std; int main() { ifstream f("test.txt"); string line,lastline; lastline = "*"; while(f && !f.eof()) { getline(f,line); if(lastline != "*") { if(line != "*") { cout << lastline << endl; } else { cout << "before * : " << lastline << endl; } } lastline = line; } if(lastline != "*") { cout << lastline << endl; } f.close(); return 0; } giver a b before * : c e before * : f g
17. juni 2005 - 21:25
#12
Okay! Jeg forsøger mig med det, men jeg får først mulighed for at teste det imorgen! Mine funktioner er recursive og jeg får muligvis brug for at hente * ud i et andet lag! Tror du det er muligt på denne måde ???
17. juni 2005 - 21:36
#13
line og lastline kunne jo gemmes globalt
17. juni 2005 - 23:25
#14
Jeg er bare ikke meget for at gemme variable globalt!
18. juni 2005 - 09:15
#15
Det virker ikke efter hensigten i mit projekt! Jeg kan jo godt have kørt flere linjer ind, inden jeg skal bruge mine * ud igen, så skal jeg jo gemme op til 200 linjer, det er for besværligt! Der må være en smart måde til at rykke sin pointer en linje tilbage i input filen
18. juni 2005 - 11:21
#16
det er faktisk ikke så besværligt at gemme mange linier i en cirkulær buffer men jeg prøver lige at se om jeg kan lave et flyt eksempel
18. juni 2005 - 13:58
#17
#include <iostream> #include <fstream> #include <string> using namespace std; int main() { ifstream f("test.txt"); string line; while(f && !f.eof()) { getline(f,line); cout << line << endl; if(line == "*") { f.putback('\n'); f.putback('*'); getline(f,line); cout << "read again: " << line << endl; } } f.close(); return 0; } giver: a b c * read again: * e f * read again: * g altså putpack af '\n' og putback af alle de tegn som skal læses igen.
18. juni 2005 - 14:59
#18
Mange Takker! Send du et svar og du får dine velfortjente points
18. juni 2005 - 15:02
#19
ok
Kurser inden for grundlæggende programmering