[C++] Hosts Datei bearbeiten

Hoeze

Mitglied
//Ich bin ziemlich schlecht in C++, habs nie richtig gelernt, kann eig nur noch ein paar Grundfunktionen, also nicht wundern, wenn ich mal blöd frage

Ich will ein Programm schreiben, das nach bestimmten Einträgen in der Windows hosts Datei sucht und ggf. löscht. für den Anfang hab ich einfach mal meine Hosts datei auf meinen Desktop kopiert und in Hosts.txt umbenannt. Dann haab ich folgendes geschrieben:
Code:
int main()
{		
	fstream file;
	char zeile[1024];


	while (!file.good())
	{
		file.open("C:\\Users\\Florian\\Desktop\\hosts.txt", ios::in);
	}

	file.seekg(0,ios::beg);
	
	file.getline(zeile,1024);
	cout << file.tellg() << zeile << endl;

	 
	
	file.close();
	
	system("PAUSE");

}
(Die While-Schleife hat übrigens ihren Sinn, der ist nur noch nicht so ganz ersichtlich, weil ein Teil noch fehlt)

Allerdings bekomme ich immer nur -1 ausgegeben. Was ist hier mein Problem, was hab ich falsch gemacht?
 
Hallo,

der Ausdruck !file.good() ergibt beim erstem Mal gleich false, da keines der Fehlerbits gesetzt ist. Der Schleifenkörper wird also nie ausgeführt und ergo die Datei nie geöffnet. Verwende stattdessen z.B. !file.is_open(). Der Sinn der Schleife erschließt sich mir trotzdem nicht so ganz, das lässt sich bestimmt auch anders lösen.

Grüße,
Matthias
 
Aah, danke, jetzt läufts
Jetzt will ich da auch Einträge rausparsen können, also hab ich mal versucht, den ersten unwichtigen Teil mit den '#' zu ignorieren:
PHP:
int main()
{       
    fstream file;
    char zeile[1024];
	string IP;
	string Domain;

	
 
 
    if (!file.is_open())
	{
        file.open("C:\\Users\\Florian\\Desktop\\hosts.txt", ios::in);
	}
 
	
    file.seekg(0,ios::beg);
    
	while (!file.eof())
	{
		switch (file.get())
		{
			case '\#':
				while(file.get() != '\n');
				break;
			case ' ':
				while(file.get() != '\n');
				break;
			default:
				file>>IP>>Domain;
				cout << file.tellg() << ":\t" <<"\t" << IP << "\t" << Domain << endl;
				break;
		}
	}
     
    
    file.close();
    
    system("PAUSE");
 
}
meine Hosts:
# Copyright (c) 1993-2009 Microsoft Corp.
#
# This is a sample HOSTS file used by Microsoft TCP/IP for Windows.
#
# This file contains the mappings of IP addresses to host names. Each
# entry should be kept on an individual line. The IP address should
# be placed in the first column followed by the corresponding host name.
# The IP address and the host name should be separated by at least one
# space.
#
# Additionally, comments (such as these) may be inserted on individual
# lines or following the machine name denoted by a '#' symbol.
#
# For example:
#
# 102.54.94.97 rhino.acme.com # source server
# 38.25.63.10 x.acme.com # x client host

# localhost name resolution is handled within DNS itself.
# 127.0.0.1 localhost
# ::1 localhost
127.0.0.1 ...

Es hat alles recht gut funktioniert, bis auf die erste Zeile:
718: # localhost
Außerdem vergisst er hin und wieder die 1 bei 127.0.0.1...

Was ist da jetzt schiefgegangen? Wie bekomme ich die auch noch weg?


EDIT:
Ich hab jetzt auch noch mal etwas anderes probiert:
PHP:
int main()
{       
    fstream file;
    char zeile[1024];
	char IP[1024];
	char Domain[1024];
 
    if (!file.is_open())
	{
        file.open("C:\\Users\\Florian\\Desktop\\hosts.txt", ios::in);
	}
 
	
    file.seekg(0,ios::beg);
    
	while (!file.eof())
	{
		file.getline(zeile,1024);
		switch (zeile[0])
		{
			case '\#':
				break;
			case ' ':
				break;
			default:
				int x=0;
				for (x;zeile[x] != ' ';x++)
				{
					IP[x] = zeile[x];
				}
				for (x;zeile[x] == ' ';x++) {}
				for (x;zeile[x] != '\n';x++)
				{
					Domain[x] = zeile[x];
				}
				cout << file.tellg() << ":\t" <<"\t" << IP << "\t" << Domain << endl;
				break;
		}
	}
     
    
    file.close();
    
    system("PAUSE");
 
}

Allerdings bekomme ich da immer alle möglichen Fehlermeldungen, die alle i-was mit Zugriffsverletzungen o.ä. zu tun haben... Was hab ich hier schon wieder falsch gemacht?
 
Zuletzt bearbeitet:
Aah, danke, jetzt läufts
Jetzt will ich da auch Einträge rausparsen können, also hab ich mal versucht, den ersten unwichtigen Teil mit den '#' zu ignorieren:
Code:
int main()
{       
    fstream file;
    char zeile[1024];
	string IP;
	string Domain;

	
 
 
    if (!file.is_open())
	{
        file.open("C:\\Users\\Florian\\Desktop\\hosts.txt", ios::in);
	}
Was soll diese Überprüfung? Selbstverständlich ist die Datei nicht offen, du hast keinen Dateinamen angegeben? :confused:

Du solltest es so machen:
C++:
fstream file("C:\\Users\\Florian\\Desktop\\hosts.txt", ios::in);

if (!file.is_open()) {
  // Fehler, Datei konnte nicht geöffnet werden.
  ... 
  return 1; // Programm beenden.
}
C++:
    file.seekg(0,ios::beg);
Nach dem Öffnen der Datei ist der Lesezeiger bereits auf Position 0 gesetzt. Die Anweisung hat also keine Wirkung.
C++:
while (!file.eof())
Mein Lieblingsthema...

Das ist falsch. Suche hier mal nach "c++ eof probleme" etc.

Warum liest du denn nicht zeilenweise ein?
C++:
string line;
while (getline(file, line)) {
  if (line[0] == '#') continue;

  ...
}
\edit: Die std::string Klasse bietet übrigens so nette Methoden wie find_first_not_of womit man ziemlich einfach das erste Zeichen finden kann, welches kein Leerzeichen ist.
C++:
	switch (file.get())
Hier liest du ein Zeichen ein, welches du auch prüfst, aber du speicherst es nicht. Deswegen ist dann das erste Zeichen verloren...
C++:
				while(file.get() != '\n');
Das geht natürlich auch einfacher. Schau doch mal in eine C++ Referenz:
C++:
file.ignore(8000, '\n');
EDIT:
Ich hab jetzt auch noch mal etwas anderes probiert:
Code:
		for (x;zeile[x] != ' ';x++)
				{
					IP[x] = zeile[x];
				}
Du suchst hier unbedingt nach einem Leerzeichen. Was wenn keins drin ist? Du liest über das Ende des Arrays hinaus und bekommst einen Speicherzugriffsfehler.

Gruß
 
Zuletzt bearbeitet:
Zurück