Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » Rätselecke » For Runaways: Zeile löschen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
01.10.2002, 15:16 Uhr
virtual
Sexiest Bit alive
(Operator)


Schreibe eine Routine delline, die folgenden Prototypen hat:

C++:
int delline(const char* name, size_t line);


Die Funktion soll aus der Datei name die line-te Zeile löschen, wobei die Zeilen ab 0 gezählt werden. Sollte die Datei weniger als line Zeilen haben, soll die Funktion fehlschlagen. Ausserdem soll die Funktion ganz ohne temporäre Dateien auskommen. Die Funktion gibt die Anzahl der glöschten Zeichen zurück, -1 im Falle eines Fehlers.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
02.10.2002, 12:24 Uhr
void*
Generic Pointer
(Operator)


Hallo!

Hier auch mal ein Beitrag von mir ...
Ist nicht schön, aber "straightforward" und simpel.


C++:
#include <cstdio>
#include <string>

// ...

// Description: This function deletes a line out of a file.
// Parameters: name of the file out of which a line shall be deleted,
// number of line to be deleted (count starts at 0)
// Return value: number of characters that were deleted (including '\n'), -1
// file could not be opened for reading, -2 error reading file, -3 error opening
// file for writing, -4 error writing file, 0 line number 'line' does not exist
int delline(const char* name, size_t line)
{
  // read the whole file and write it into buffer
  std::FILE *input=std::fopen(name, "r");
  if(!input)
    return(-1);

  std::string buffer;
  int c;

  while(EOF!=(c=fgetc(input)))
  {
    buffer+=static_cast<char>(c);
  }

  if(!feof(input)) // Builder doesn't want eof() in std?!
  {
    (void)std::fclose(input);
    return(-2);
  }

  if(EOF==std::fclose(input))
    return(-2);  

  // search the start of the line that has to be deleted
  unsigned int currentLine=0;
  std::string::size_type currentPosition=0, oldPosition=0;

  while(currentLine<line)
  {
    currentPosition=buffer.find_first_of('\n', oldPosition);
    if(std::string::npos==currentPosition)
      return(0);
    oldPosition=++currentPosition;
    if(buffer.length()<=oldPosition)
      return(0);
    ++currentLine;
  }

  // find the end of the current line
  std::string::size_type endPosition=buffer.find_first_of('\n', currentPosition);
  
  // determine number of chars to be deleted...and get rid of them
  int numberOfCharsDeleted= std::string::npos==endPosition ? buffer.length()-currentPosition : endPosition-currentPosition+1;
  buffer.erase(currentPosition, numberOfCharsDeleted);

  // write the modified buffer
  std::FILE *output=std::fopen(name, "w");
  if(!output)
    return(-3);

  if(0>fprintf(output, "%s", buffer.c_str()))
  {
    (void)std::fclose(output);
    return(-4);
  }

  if(EOF==std::fclose(output))
  {
    return(-4);
  }

  return(numberOfCharsDeleted);
}



MfG
void*
--
Gruß
void*
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
03.10.2002, 15:07 Uhr
fry_



Hi Ihr

Wenn keine Lösungen mehr kommen, hätte ich dazu eine Frage: Kann man in 'fstream' eigentlich auch mit Filepionter arbeiten, so wie in void*s geniale Lösung? Ich kenne mich mit diesem Thema überhaupt nicht aus u. darum habe ich mir auch schon an folgendem Satz die Zähne ausgebissen:

Zitat:

Ausserdem soll die Funktion ganz ohne temporäre Dateien auskommen.

(war ganz schön gemein, wie ich finde )

Ich würde gerne, wegen ein u. auslesen in Dateien, bei 'fstream' bleiben u. ein Beispiel, wie man dort mit Filepointer umgeht, wäre wirklich klasse.
--
mit computern geht alles viel schneller
es dauert nur ein bisschen länger

Dieser Post wurde am 03.10.2002 um 15:08 Uhr von fry_ editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
03.10.2002, 22:32 Uhr
virtual
Sexiest Bit alive
(Operator)


Verstehe ich Deine Frage richtig? - Du willst fstream mit FILE mischen? - Das geht nicht.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
03.10.2002, 23:55 Uhr
fry_



Ich wollte wissen, ob die Möglichkeit besteht, eine vergleichbare Lösung nur mit fstream zu schreiben. Wenn nicht, bräuchte ich nicht mehr das ganze Internet zu durchpflügen.
--
mit computern geht alles viel schneller
es dauert nur ein bisschen länger
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
04.10.2002, 13:43 Uhr
fry_



Ich hab' endlich etwas Brauchbares gefunden -> da werde ich mich mal durcharbeiten.

Gruß
--
mit computern geht alles viel schneller
es dauert nur ein bisschen länger
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ Rätselecke ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: