FILE-Zeiger Datei-Ende Müll

Von: , Frage gestellt am Do, 7. Feb 2008

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 <stdio.h>
#include <conio.h>
#include <fstream>
#include <cassert>
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 = 0;}
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 << neueVersion->c_str();
of.close();
}
delete[] code;
delete neueVersion;
return 0;
}

/////////// hier noch die "artikel.htm":
<html>
<head>
<title>Umlaute ersetzen</title>
</head>
<body>
<div style="width:30%;">
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.
</div>
</body>
</html>

2 Antworten zu dieser Frage

  1. Antwort von nach 2 Stunden 1 hilfreich
    Re: FILE-Zeiger Datei-Ende Müll

    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 <fstream>
    #include <map>
    using namespace std;
    void my_html_entities(map<char, string>& t)
    {
    t['ä'] = "&auml;" ; t['ö'] = "&ouml;" ; t['ü'] = "&uuml;" ; t['"'] = "&quot;" ; 
    t['Ä'] = "&Auml;" ; t['Ö'] = "&Ouml;" ; t['Ü'] = "&Uuml;" ; t['ß'] = "&szlig;"; 
    } 
    int main()
    {
    map<char, string> 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 << c;                    // nicht dabei
    else
    outfile << htmlchars[c].c_str(); // ok, uebersetzen
    }
    return 0;
    }
    

    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 << c;
    else
    outfile << "&#" << int(unsigned char(c)) << ";";
    }
    ...
    
    Grüße

    CMБ

    • Antwort von nach 21 Stunden 0 hilfreich
      Re^2: FILE-Zeiger Datei-Ende Müll

      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, :-)
      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

Keine passende Antwort gefunden? Jetzt eigene Frage stellen!