[C++] Datei auslesen bis Zeichen

Diskutiere [C++] Datei auslesen bis Zeichen im Developer Network Forum im Bereich Hardware & Software Forum; Hi, bisher habe ich es geschafft die Startseite vom Internet-Explorer (klick) zu ändern, die vom Mozilla Firefox (klick) und jetzt will ich mich...
  • [C++] Datei auslesen bis Zeichen Beitrag #1
Max11.111

Max11.111

Bekanntes Mitglied
Dabei seit
12.06.2008
Beiträge
2.416
Reaktionspunkte
0
Hi,
bisher habe ich es geschafft die Startseite vom Internet-Explorer (klick) zu ändern, die vom Mozilla Firefox (klick) und jetzt will ich mich an den neuen Browser von Google ranmachen, um ein Programm zu schreiben, das dessen Startseite ändert.

Ich weiß jetzt schon, das nur die Datei "Preferences" von Bedeutung ist.

Der Inhalt sieht folgendermaßen aus:
Code:
[...]

   "security": {
      "cookie_behavior": 0
   },
   "session": {
      "restore_on_startup": 4,
      [B]"urls_to_restore_on_startup": [ "http://powerforen.de/forum/index.php", "http://www.youtube.com/" ][/B]
   },
   "webkit": {
      "webprefs": {

      }
   }
}
Wichtig ist jetzt die Zeile 39:
Code:
"urls_to_restore_on_startup": [ "http://powerforen.de/forum/index.php", "http://www.youtube.com/" ]
Ich muss jetzt am Schluss der Zeile (vor dem ]) ein Komma machen, dann ein Leerzeichen und dann in Anführungszeichen die neue Startseite hineinschreiben.

Das ganz sollte dann so aussehen:
Zeil 39:
Code:
"urls_to_restore_on_startup": [ "http://powerforen.de/forum/index.php", "http://www.youtube.com/"[B], "http://www.google.com" [/B]]


Das Auslesen bis Zeile 39 geht mit dem Code:
Code:
// [...]
	ifstream Datei("Preferences", ios::in);
	if (Datei.good())
	{
		string Puffer="";

		for(int i=1;i<=39;i++)
		{
		getline(Datei, Puffer);
		}
		cout << Puffer;
	}
	else
	{
		return 1;
	}
	getchar();
return 0;
}


Aber jetzt muss ich bis zum Zeichen "]" auslesen, und dann erst was reinschreiben.
Ab jetzt habe ich keinen blassen Schimmer mehr, wie das geht.:tr


Ich bedanke mich für eure Hilfe!:goil:
 
  • [C++] Datei auslesen bis Zeichen Beitrag #2
fox99

fox99

Bekanntes Mitglied
Dabei seit
27.11.1999
Beiträge
3.948
Reaktionspunkte
27
Ort
Omicron Persei 8
das sieht für mich jetzt mal so ein kleinwenig nach json aus. such dir für c++ eine passende bibliothek, die das lesen und schreiben kann und der rest sollte dann nicht mehr so viel sein.
 
  • [C++] Datei auslesen bis Zeichen Beitrag #3
the ubm

the ubm

Senior Moderator
Dabei seit
29.05.2005
Beiträge
9.464
Reaktionspunkte
1
Nachdem mir nicht bekannt ist, wie man einzelne Zeichen einfügt, musst du erstmal den nachfolgenden Inhalt vollständig auslesen, in einen Puffer A speichern. Dann setzt du den Dateizeiger an die Position vor der eckigen Klammer, schreibst deinen Inhalt rein, machst die eckige Klammer zu und fügst dann den Inhalt von Puffer A an.
 
  • [C++] Datei auslesen bis Zeichen Beitrag #4
Max11.111

Max11.111

Bekanntes Mitglied
Dabei seit
12.06.2008
Beiträge
2.416
Reaktionspunkte
0
Also:
Code:
// [...]
ifstream Datei("Preferences", ios::in);
if (Datei.good())
{
	string Puffer="";

	for(int i=1;i<=46;i++) //46 Zeilen in Preferences
	{
	getline(Datei, Puffer);
	}
// [...]
Die Datei "Preferences" enthält 46 Zeilen; ist also jetzt vollständig eingelesen.

Wie setzte ich jetzt einen Datenzeiger auf "]"?
Meinst du
Code:
char *Puffer= //Position von "]"
Aber woher weiß ich jetzt die Position von "]"?
 
  • [C++] Datei auslesen bis Zeichen Beitrag #5
U

UnimatrixZero

Bekanntes Mitglied
Dabei seit
27.06.2001
Beiträge
645
Reaktionspunkte
0
Das ist der falsche Weg. Sobald sich in der Datei irgendetwas verändert, wird sich auch die Position der Home-Page-Konfiguration ändern. In Zeile 39, Spalte 46 steht dann etwas anderes, das Du dann überschreibst.

Der einfachste Weg ist es, die ganze Datei einzulesen, zu ändern und dann zurückzuschreiben. Du könntest z.B. die ganze Datei in einen string einlesen und dann per Find, RE, usw. die neue URL einfügen und den neuen String wieder in die Datei schreiben.

Der "richtige" Weg wäre, eine JSON-Library zu verwenden. Unter http://www.json.org/ findest Du mehrere fertige C++-Bibliotheken dafür. Z.B. diese hier: http://jsoncpp.sourceforge.net/
Dürfte aber auch um einiges aufwendiger sein, da Du zuerst die Library zum Laufen bringen mußt.
 
  • [C++] Datei auslesen bis Zeichen Beitrag #6
Max11.111

Max11.111

Bekanntes Mitglied
Dabei seit
12.06.2008
Beiträge
2.416
Reaktionspunkte
0
Nachdem mir nicht bekannt ist, wie man einzelne Zeichen einfügt, musst du erstmal den nachfolgenden Inhalt vollständig auslesen, in einen Puffer A speichern. Dann setzt du den Dateizeiger an die Position vor der eckigen Klammer, schreibst deinen Inhalt rein, machst die eckige Klammer zu und fügst dann den Inhalt von Puffer A an.
[...]
Der einfachste Weg ist es, die ganze Datei einzulesen, zu ändern und dann zurückzuschreiben. Du könntest z.B. die ganze Datei in einen string einlesen und dann per Find, RE, usw. die neue URL einfügen und den neuen String wieder in die Datei schreiben.
[...]

Okay, ich habe jetzt die ganze Datei in den string Inhalt gelesen.
Jetzt suche ich die Klammer.
("]" ist die Einzige Eckige-Klammer in "Preferences"!)

Code:
        ifstream Pref("Preferences", ios::in);
	if (Pref.good())
	{
		string Inhalt("");

		for(int i=0; i<46; i++)
		{
		getline(Pref, Inhalt);
		}

		string::size_type loc =Inhalt.find("[", 0);
		cout << "Found \"[\" at " << loc << "." << endl;	
	}


Allerdings verstehe ich jetzt die Ausgabe nicht ganz:

Ist 4294967295 die Stelle an der die Klammer ist?

Was ist das
[...]und dann per Find, RE, usw. die neue URL einfügen[...]
Google habe ich schon bemüht, ohne Erfolg.
 
  • [C++] Datei auslesen bis Zeichen Beitrag #7
U

UnimatrixZero

Bekanntes Mitglied
Dabei seit
27.06.2001
Beiträge
645
Reaktionspunkte
0
Das sind 2 Ansätze. Bei dem von ubm wird die Datei bis zur zu ändernden Stelle gelesen, der Rest in einen Puffer geschrieben.

Mein Ansatz liest einfach die komplette Datei in den Speicher und die Änderungen erfolgen im Speicher.

Allerdings machst Du wieder denselben Fehler. Du darfst nicht einfach bis Zeile 46 lesen. Das mag zwar bei Deiner Preferences funktionieren, aber sehr wahrscheinlich nicht bei anderen.

Lies einfach die GESAMTE Datei in einen string. Die String-Klasse bietet Methoden wie find, substr, insert usw. an. Damit kannst Du dann ganz einfach im string, also der Datei, suchen einfügen usw.

Dazu suchst Du zuerst nach dem String "urls_to_restore_on_startup". Von dort aus dann nach dem Ende der URL-Liste (']') und fügst davor Deine neue URL ein. Die genauen Methoden habe ich jetzt nicht parat, stehen aber alle in der Dokumentation der Klasse string.
 
  • [C++] Datei auslesen bis Zeichen Beitrag #8
Max11.111

Max11.111

Bekanntes Mitglied
Dabei seit
12.06.2008
Beiträge
2.416
Reaktionspunkte
0
Das sind 2 Ansätze. Bei dem von ubm wird die Datei bis zur zu ändernden Stelle gelesen, der Rest in einen Puffer geschrieben.

Mein Ansatz liest einfach die komplette Datei in den Speicher und die Änderungen erfolgen im Speicher.
Okay, ich mach dann deinen!
@ the ubm: Das nächst mal beachte ich deine Lösung, Versprochen;)

Allerdings machst Du wieder denselben Fehler. Du darfst nicht einfach bis Zeile 46 lesen. Das mag zwar bei Deiner Preferences funktionieren, aber sehr wahrscheinlich nicht bei anderen.
Yes Sir:
Code:
		do
		{
			getline(Pref, Inhalt);
		}while(!Pref.eof());

Lies einfach die GESAMTE Datei in einen string. Die String-Klasse bietet Methoden wie find, substr, insert usw. an. Damit kannst Du dann ganz einfach im string, also der Datei, suchen einfügen usw.

Dazu suchst Du zuerst nach dem String "urls_to_restore_on_startup". Von dort aus dann nach dem Ende der URL-Liste (']') und fügst davor Deine neue URL ein. Die genauen Methoden habe ich jetzt nicht parat, stehen aber alle in der Dokumentation der Klasse string.

Hmm, ich brauch also insert.
Code:
string& insert ( size_t pos1, const string& str );

Code:
		string::size_type Urls = Inhalt.find("\"urls_to_restore_on_startup\"", 0);
		cout << "Found \"urls_to_restore_on_startup\" at " << Urls << "." << endl;

		string::size_type Klammer = Inhalt.find("]", 0);
		cout << "Found \"]\" at " << Klammer << "." << endl;

		Inhalt.insert((Klammer-1), ", \"http://www.google.com\"");
Aber das Funktioniert ja wieder nicht:no::tr

P.S.: Guten rutsch' ins neue Jahr:hal:
 
  • [C++] Datei auslesen bis Zeichen Beitrag #9
Max11.111

Max11.111

Bekanntes Mitglied
Dabei seit
12.06.2008
Beiträge
2.416
Reaktionspunkte
0
Hi,

Ich habe mich jetzt nochmal damit beschäftigt und jetzt gehts soweit:
Code:
#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int main(int argc, char **argv[1])
{
	// argv[0] = "Google Chrome.exe"
	// argv[1] = "NewStartPage"

	ifstream Pref1("Preferences", ios::in);
	if (Pref1.good())
	{
		ofstream Pref2("Preferences.temp", ios::trunc); // must be .temp, other File is in use ;-) 
		if (Pref2.good())
		{
			string Inhalt="";

			for (int i=0; i<=37; i++)
			{
				getline(Pref1, Inhalt);
				Pref2 << "\n" << Inhalt;
			}
			cout << "Zeile vorher ist jetzt:" << Inhalt <<endl << endl;			
			getline(Pref1, Inhalt);
			cout << "Die wichtige Zeile ist jetzt:" << Inhalt <<endl << endl;

			string::size_type Urls = Inhalt.find("\"urls_to_restore_on_startup\"", 0);
			cout << "Found \"urls_to_restore_on_startup\" at " << Urls << "." << endl << endl;

			string::size_type Klammer = Inhalt.find("]", 0);
			cout << "Found \"]\" at " << Klammer << "." << endl << endl;

			Inhalt.insert((Klammer-1), ", \"http://www.google.com\"");

			cout << "Inhalt ist jetzt:" << Inhalt <<endl;
			Pref2 << "\n" << Inhalt;
Jetzt brauche ich aber auch noch den Teil nach dem "url_..." in der zweiten Datei:
Code:
			do
			{
				getline(Pref1, Inhalt);
				Pref2 << "\n" << Inhalt;
			}while(Pref1.eof())
		}
		else
		{
			return 1;
		}
	}
	else
	{
		return 1;
	}
	//getchar();
	return 0;
}
Jetzt schreibt er aber bloß folgendes in Preferences.

Orginal:
Code:
[...]
   "urls_to_restore_on_startup": [ "http://powerforen.de/forum/index.php", "http://www.youtube.com/" ]
   },
   "webkit": {
      "webprefs": {

      }
   }
}
Kopie:
Code:
 "restore_on_startup": 4,
      "urls_to_restore_on_startup": [ "http://powerforen.de/forum/index.php", "http://www.youtube.com/", "http://www.google.com" ]
   },
   "webkit": {
      "webprefs": {

      }
   }
}
[[B][I][U]942850 leere Zeile[/U][/I][/B]]
Warum schreibt der jetzt eine 1.8 MB große Datei wenn die Ursprüngliche nur 2KB groß ist??
wieso macht das Programm so viele Leerzeilen am Ende?
 
  • [C++] Datei auslesen bis Zeichen Beitrag #10
M

MacDisein

Bekanntes Mitglied
Dabei seit
28.03.2000
Beiträge
101
Reaktionspunkte
0
Warum machst du dir das denn bloß so kompliziert? :confused:

Hier mal ein kleines Codeschnippselchen:

Code:
  long size;
  std::string fileContent;

  ifstream infile ("Preferences",ifstream::binary);
  ofstream outfile ("Preferences.temp",ofstream::binary);

  // get size of file
  infile.seekg(0,ifstream::end);
  size=infile.tellg();
  infile.seekg(0);

  // allocate memory for file content
  fileContent.resize(size);

  // read content of infile
  infile.read (&fileContent[0], size);

  // add new url
  string::size_type urlsPos = fileContent.find("\"urls_to_restore_on_startup\"", 0);

  string::size_type parenthesePos = fileContent.find("]", urlsPos);
  
  std::string newURL = ", \"[URL]http://www.google.de\"[/URL];

  fileContent.insert(parenthesePos - 1, newURL);

  // write to outfile
  outfile.write (&fileContent[0], size + newURL.size());
  
  outfile.close();
  infile.close();


Ich habe das jetzt einfach nur so runtergeschrieben, es könnten also noch Syntaxfehler drin sein, aber vom Prinzip her.


MacDisein
 
  • [C++] Datei auslesen bis Zeichen Beitrag #11
U

UnimatrixZero

Bekanntes Mitglied
Dabei seit
27.06.2001
Beiträge
645
Reaktionspunkte
0
Warum machst du dir das denn bloß so kompliziert? :confused:

...

Hier mal ein kleines Codeschnippselchen:

Ich habe das jetzt einfach nur so runtergeschrieben, es könnten also noch Syntaxfehler drin sein, aber vom Prinzip her.
Jep. Genauso meinte ich das ;-)
 
  • [C++] Datei auslesen bis Zeichen Beitrag #12
Max11.111

Max11.111

Bekanntes Mitglied
Dabei seit
12.06.2008
Beiträge
2.416
Reaktionspunkte
0
Warum machst du dir das denn bloß so kompliziert? :confused:

Hier mal ein kleines Codeschnippselchen:



Ich habe das jetzt einfach nur so runtergeschrieben, es könnten also noch Syntaxfehler drin sein, aber vom Prinzip her.


MacDisein

Jep. Genauso meinte ich das ;-)
Okay, ich werde das jetzt mal übernehmen!


Danke an alle für die Hilfe!
danke.gif
 
  • [C++] Datei auslesen bis Zeichen Beitrag #13
M

MacDisein

Bekanntes Mitglied
Dabei seit
28.03.2000
Beiträge
101
Reaktionspunkte
0
Übernehmen alleine reicht nicht, du sollst es ja auch verstehen, es bringt ja nichts einfach nur von irgendwoher Code zu übernehmen.
Wenn du also Fragen haben solltest, dann immer raus damit.


MacDisein
 
  • [C++] Datei auslesen bis Zeichen Beitrag #14
Max11.111

Max11.111

Bekanntes Mitglied
Dabei seit
12.06.2008
Beiträge
2.416
Reaktionspunkte
0
Nein, ich denke das ich da schon kapiert habe:D

Natürlich kopiere ich das nicht nur!
Ich gehe deinen Code Zeile für Zeile durch.
Mir geht es nicht um die geänderte Startseite, sondern nur um den Lerneffekt!

Ich will ja auch nicht unbedingt das Programm haben, sondern das Programm als Lernziel schreiben!;)



Danke MacDisein für die Info, ich weiß es gibt auch solche die nur Kopieren können...:no:
 
Thema:

[C++] Datei auslesen bis Zeichen

ANGEBOTE & SPONSOREN

https://www.mofapower.de/

Statistik des Forums

Themen
213.179
Beiträge
1.579.172
Mitglieder
55.878
Neuestes Mitglied
Satan666
Oben