In die Datei reinschreiben.

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
canlot
Beiträge: 393
Registriert: Di Mär 08, 2011 11:01 pm
Wohnort: NRW

In die Datei reinschreiben.

Beitrag von canlot » Fr Feb 03, 2012 9:20 pm

Hallo alle zusammen.
Nach ca. einem halben Jahr wieder angefangen mit C und habe schon mein erstes Problem.
Ich will in eine Datei mittendrin was reinschreiben d.h. nicht am Ende und nicht am Anfang.
ich kann mit fseek() die Position bestimmen und wenn ich z.B. mit fprintf() was reinschreiben dann werden die nachfolgenden Inhalte einfach überschrieben. Hat jemand eine Idee wie man es vielleicht schön sauber mit relativ wenig Aufwand hinkriegen könnte?
Unwissenheit ist ein Segen

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: In die Datei reinschreiben.

Beitrag von cloidnerux » Fr Feb 03, 2012 9:21 pm

Lese alles bis zum ende, speichere es, schreibe was du schreiben willst und schreibe den rest.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Kmitska
Beiträge: 349
Registriert: Fr Sep 23, 2011 8:49 pm
Wohnort: Karlsruhe, Pforzheim

Re: In die Datei reinschreiben.

Beitrag von Kmitska » Fr Feb 03, 2012 9:25 pm

Hallo,
leider kenn ich mich mit C nicht so aus, aber vielleicht kann ich dir erklären, wie so etwas gehen würde.

Du weisst ja, wo du es reinschreiben möchtest, also würde ich:
- einen string erstellen, mit dem du den ersten Teil bis zum gewünschten Position speicherst
- einen 2. string, worin du dein Text speicherst
- einen 3. string der ab den Punkt den Rest speichert (Also bis: \0)

Und am Ende kannst du sie ja einfach aufbauen (strcat vielleicht?)
string1 + string2 + string3

Grüße,
Kmitska

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: In die Datei reinschreiben.

Beitrag von Xin » Fr Feb 03, 2012 10:01 pm

Alles bis zur Position ab der Du schreiben willst ist unkritisch.

fseek zur Position, ab der Du schreiben willst. Von da an musst Du die Daten bis zum Schluss in den Speicher laden. Dann fseekst Du wieder zurück, schreibst die einzufügenden Daten und danach die Daten, die Du dahinter haben möchtest.

Eine "Einfüge"-Operation gibt es nicht.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

canlot
Beiträge: 393
Registriert: Di Mär 08, 2011 11:01 pm
Wohnort: NRW

Re: In die Datei reinschreiben.

Beitrag von canlot » Fr Feb 03, 2012 10:28 pm

@Kmitska so habe ich mir auch schon gedacht ich habe gehofft das es einfacher ginge.
@Xin ok und wie lese ich sie am besten aus? mit fscanf() vielleicht?
Unwissenheit ist ein Segen

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: In die Datei reinschreiben.

Beitrag von Xin » Sa Feb 04, 2012 11:01 am

canlot hat geschrieben:@Kmitska so habe ich mir auch schon gedacht ich habe gehofft das es einfacher ginge.
Schreib Dir eine insert-Routine und gut :-)
Ab diesem Zeitpunkt ist es einfacher.
canlot hat geschrieben:@Xin ok und wie lese ich sie am besten aus? mit fscanf() vielleicht?
Benutze fread() und fwrite().

Wenn Du in gigantischen Dateien arbeitest, dann solltest Du vielleicht in 100k oder 1MB Schritten einlesen und wegschreiben, sonst verbrauchst Du zuviel Speicher.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

canlot
Beiträge: 393
Registriert: Di Mär 08, 2011 11:01 pm
Wohnort: NRW

Re: In die Datei reinschreiben.

Beitrag von canlot » Do Feb 09, 2012 10:02 pm

Ok ich habe das Programm geschrieben aber es funktioniert nicht wie ich es möchte.
In dem Programm möchte ich eine Stelle suchen auf der eine bestimmte Zeichenfolge zutrifft. Nach der Zeichenfolge möchte ich in das Programm reinschreiben was ich eingegeben habe und dann den Rest der Datei anhängen.
Das ganze ich ein Testprogramm für CGI ;) nur damit ihr bescheid wisst :)

Code: Alles auswählen

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define file_name "test.txt"



int tell_position(char *string, char *search_string)
{
    int counter = 0;
    int counter_inside = 0;
    int size_string = strlen(search_string);

    while(*string != '\0')
    {
        while(*(string+counter) == *(search_string+counter_inside))
        {
            counter++;
            counter_inside++;

            if(*(search_string+counter_inside) == '\0')
                return counter;

            if(*(string+counter) != *(search_string+counter_inside))
            {
                counter -= counter_inside;
            }
        }
        counter++;
    }
    return -1;
}

char *cat_string(char *string, int start_position, int end_position)
{
    char *return_string = malloc((end_position-start_position)*sizeof(char));
    int counter = 0;
    while(start_position <= end_position)
    {
        *(return_string+counter) = *(string+start_position);
        counter++;
        start_position++;
    }
    *(return_string+counter) = '\0';
    return return_string;
}


int main (void)
{
  FILE *file = fopen(file_name, "r");
  long int size;
  char *buffer = NULL;
  char *input = malloc(sizeof(char));
  char *search_string = "<body>";
  char *start_string = NULL;
  char *end_string = NULL;
  int position = 0;
  
  char *whole_string = NULL;

    fseek( file, 0, SEEK_END );
    size = ftell( file );
    fseek( file, 0, SEEK_SET );

    buffer = (char *) malloc( size );

    
      long int read = fread( buffer, sizeof( char ), size-1, file );

      if( read != size - 1 )
      buffer[ read ] = '\0';

    fclose(file);

    fgets(input, 100, stdin);

    position = tell_position(buffer, search_string);
    start_string = cat_string(buffer, 0, position);

    whole_string = malloc(sizeof(char));
    *whole_string = '\0';

    whole_string = start_string;
    strcat(whole_string, input);
    end_string = cat_string(buffer, position, strlen(buffer));
    strcat(whole_string, end_string);



        fopen(file_name, "w+");
        fwrite(whole_string, sizeof(char), strlen(whole_string), file);
        fclose(file);

    return EXIT_SUCCESS;
}

Unwissenheit ist ein Segen

Antworten