schreiben in eine Datei mit fprintf

stimmen
1

Ich versuche, in eine Datei mit dieser Funktion zu schreiben. Wenn ich die Funktion mit dieser Zeile nennen bleibt die Datei leer:

if(argc-optind==0){
  char* line=readcli();
  printf(testline:%s\n,line); //WORKS
  line=replacet(line,t,countt(line));
  if(oFlag==1){
    writeinfile(line,oFileName);
  }else{
    printf(Expanded:%s\n,line);
  }
}

Aber wenn ich es so nennen es funktioniert:

char text[]={test};
char * textptr=text;
writeinfile(textptr,fp);

void writeinfile(char* line,char* file){
  FILE *f = fopen(file, a);
  if (f == NULL){
    printf(Error opening file!\n);
    exit(1);
  }
  fprintf(f, Some text: %s\n,line);
  fclose(f);
}

ersetzt Tabs mit Leerzeichen

char* replacet (char *text, int tabsize, int tabanz){
    int newsize=strlen(text)+tabsize*tabanz-tabanz;
    char newtext[newsize];//Wenn \t nu ein zeichen ist
    char* ptrnew=newtext;
    char* ptr=text;
    for(int i=0;i<strlen(text);i++,ptr++){
        if(text[i]=='\t'){
            for(int j=0;j<tabsize;j++){
                *ptrnew=' ';
                ptrnew++;
            }
        }else{
            *ptrnew=text[i];
            ptrnew++;
        }
    }
    char* newtextptr=newtext;
    return newtextptr;
}

Liest eine Zeile in der Befehlszeilenschnittstelle eingegebenen

char* readcli(){
    char *buffer;
    size_t bufsize = 64;
    size_t chars;
    buffer = (char *)malloc(bufsize * sizeof(char));
    if( buffer == NULL){
        perror(Error malloc);
    }    
    printf(Type something with Tabulators: );
    chars = getline(&buffer,&bufsize,stdin);
    printf(%zu characters were read.\n,chars);
    return buffer;
}

Bitte helfen Sie mir, ich weiß nicht, wie ich es beheben könnte. Vielen Dank

Veröffentlicht am 20/10/2018 um 12:28
quelle vom benutzer
In anderen Sprachen...                            


1 antworten

stimmen
0

Zwei Ausgabe:

  • Hier

    char* replacet (char *text, int tabsize, int tabanz){
      int newsize=strlen(text)+tabsize*tabanz-tabanz;
      char newtext[newsize];//Wenn \t nu ein zeichen ist
      ...
      char* newtextptr=newtext;
      return newtextptr;  /* <-- HERE */
    

    die Adresse einer lokalen Variablen ( newtext) zurückgegeben. Der Speicher ist nur gültig , wenn innerhalb der Funktion.

    In dem Moment, die Funktion den Speicher zurückgeführt wird autmagically free'ed. Zugriff auf sich, nachdem die Funktion zurück ruft das berüchtigte nicht definiertes Verhalten. Alles kann von dem Moment geschehen auf. Mach das nicht.

  • Die Funktion replacet()verfehlt an 0die neue C- „string“ -terminate.

Um dies zu beheben alles ersetzen

  char newtext[newsize];

durch

  char * newtext = malloc(newsize + 1); /* +1 for 0-terminator each
                                           c-"string" needs */
  if (NULL == newtext) /* Error checking is debugging for free. */
  {
    return NULL;
  }

Fügen Sie den 0-terminator vor der Abreise:

  newtext[i] = '\0'; /* or just the equivalent: ... = 0; */
  char* newtextptr = newtext;
  return newtextptr;
}

Ändern Sie den Code aus Berufung

  line=replacet(line,t,countt(line));

zu

  {
    char * pctmp = replacet(line, t, countt(line));
    if (NULL == pctmp)
    {
      /* exit or do what error handling made sense */
      exit(EXIT_FAILURE); /* include stlib.h for the EXIT_* macros */
    }
    else
    {
      free(line);
      line = pctmp;
    }
  }
Beantwortet am 20/10/2018 um 14:50
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more