FILE-Zeiger Datei-Ende Müll

Hallo Leute,

Ich habe den Tip von Peter beherzigt und eine Null am Ende der Datei angehängt.
Die Zeichen ‚ÿ‘ (152) am Ende der Datei sind jetzt *weniger* als zuvor,
treten aber immer noch auf.
Unten dran ist der Code.

vielen Dank für Eure Mühe
lg
Martin B

//////////////////////////

// htmlproc.cpp
// Umlaute bei HTML ersetzen, C++ - Compiler, Consolen-Projekt
// ich habe: WIN2K, VC6

#include 
#include 
#include 
#include 
using namespace std;

typedef const char \* CC;

string\* umlauteMaskieren (CC code)
 {
 string \*s = 0;
 s = new string;
 assert (s);
 bool literalerBereich = 0;

 for (int i=0; code[i]; i++)
 {
 char ch = code[i];
 if (ch == '') {literalerBereich = 1;}

 // in der Marke drin:
 if (! literalerBereich) {\*s += ch; continue;}

 switch (ch)
 {
 case 'ä': \*s += "ä"; break;
 case 'ö': \*s += "ö"; break;
 case 'ü': \*s += "ü"; break;
 case 'Ä': \*s += "Ä"; break;
 case 'Ö': \*s += "Ö"; break;
 case 'Ü': \*s += "Ü"; break;
 case 'ß': \*s += "ß"; break; 
 case 34: \*s += """; break;
 default: \*s += ch; break;
 }
 }

 // Datei-Ende:
 \*s += '\0';
 return s;
 }

int main()
{
 ifstream in("artikel.htm");
 if (! in.good()) { printf("cannot open file!\n"); return -1;}

 char\* code = new char[2000];
 int i;
 for (i=0; in.good(); i++)
 {code[i] = in.get();}
 code[i] = 0;
 in.close();

 string \*neueVersion = 0;
 neueVersion = umlauteMaskieren( code );

 char \*wohin = "artikel2.htm";
 if (1)
 {
 FILE \*out = fopen (wohin, "wt");
 fprintf(out, "%s%c", neueVersion-\>c\_str(), EOF);
 fclose(out);
 }
 else {
 ofstream of (wohin);
 of c\_str();
 of.close();
 }

 delete[] code;
 delete neueVersion;
 return 0;
}

/////////// hier noch die „artikel.htm“:

Umlaute ersetzen 
Bei Wörtern wie "Böller" oder "Müll" sind Umlaute drin.
Die Österreicher werden sich dran gewöhnen müssen, daß sie den Türken sehr 
ähnlich sind. Die bösen Übeltäter sitzen woanders. Ähren sind Bäume. 
Ein "muß" ist obszön.

Hallo

Ich habe den Tip von Peter beherzigt und eine Null am Ende der
Datei angehängt.
Die Zeichen ‚ÿ‘ (152) am Ende der Datei sind jetzt *weniger*
als zuvor, treten aber immer noch auf.
Unten dran ist der Code.

Das liegt daran, daß Du beim einlesen das ios::fail (-1)
mit in das Zeichenarray einliest:

 ...
 for( i=0; in.good(); i++ ) {
 code[i] = in.get(); # get() =\> fail wird eingelesen
 }
 code[i] = 0;
 ...

Allerdings schaut der Code arg komplex aus. Ich weiß
ja nicht, was Du noch vorhast, aber Du könntest das
ein wenig abspecken, eine variante wäre sowas hier:

// htmlproc.cpp
// Umlaute bei HTML ersetzen, C++ - Compiler, Consolen-Projekt
// ich habe: WIN2K, VC6
// Modified: 2008/02/07 by CMB

#pragma warning(disable: 4786) 
#include 
#include 

using namespace std;

 void my\_html\_entities(map& t)
{
 t['ä'] = "ä" ; t['ö'] = "ö" ; t['ü'] = "ü" ; t['"'] = """ ; 
 t['Ä'] = "Ä" ; t['Ö'] = "Ö" ; t['Ü'] = "Ü" ; t['ß'] = "ß"; 
} 

 int main()
{
 map htmlchars;
 my\_html\_entities(htmlchars);

 ifstream infile("artikel.htm", ios::binary);
 if( ! infile.good() ) return -1;

 ofstream outfile("artikel1.htm", ios::binary);
 if( ! outfile.good() ) return -1;

 char c;
 while( infile.get(c) ) {
 if( htmlchars.find(c) == htmlchars.end() )
 outfile 
Eigentlich würde es reichen, in der Ausgabe der
fraglichen Zeichen deren ascii-value mit "&#nnn;"
zu schreiben.

    
     ...
     while( infile.get(c) ) {
     if( htmlchars.find(c) == htmlchars.end() )
     outfile outfile #" Grüße
    
    CMБ

Dobri den Semjon,

Das liegt daran, daß Du beim einlesen das ios::fail (-1)
mit in das Zeichenarray einliest:

Das liegt dann aber an der „in.good()“, die müsste ja rechtzeitig anschlagen.
Dann könnte ich es so versuchen:

for( i=0; in.good(); i++ ) {
 code[i] = in.get(); # get() =\> fail wird eingelesen
 if (code[i] == -1) {code[i] = 0;}
 }

Wenn ich die Datei mit FILE-Zeiger einlese, habe ich dasselbe, offenbar machen die das auch mit -1.
In deinem Code

 while( infile.get(c) )

hast Du die -1 nicht abgefangen, die *.htm ist aber einwandfrei, ??

Die Maps sind natürlich praktisch für den Zweck. Vielleicht sollte ich doch mal STL lernen, statt meine eigenen Container zu basteln, :smile:
Guter Tipp das, mit den ASCII-Werten, das kannte ich gar nicht.
Wofür ist das bitte:

#pragma warning(disable: 4786)

?

Vielen Dank für Deine Mühe
lg
Martin B