записать в файл с помощью fprintf - PullRequest
0 голосов
/ 20 октября 2018

Я пытаюсь записать в файл с помощью этой функции.Когда я вызываю функцию с этой строкой, файл остается пустым:

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);
  }
}

Но если я называю это так, это работает:

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);
}

заменяет вкладки пробелами

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;
}

Читает строку, введенную в интерфейсе командной строки

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;
}

Пожалуйста, помогите мне, я не знаю, как я мог это исправить.Спасибо

1 Ответ

0 голосов
/ 20 октября 2018

Два вопроса:

  • Здесь

    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 */
    

    адрес локальной переменной (newtext) возвращается.Память действительна только если внутри функции.

    В тот момент, когда функция вернула память, автоматически освобождается.Доступ к нему после возвращенной функции вызывает печально известное неопределенное поведение.С этого момента может случиться все, что угодно.Не делайте этого.

  • Функция replacet() пропускает до 0 - определение новой C- "строки".

Кисправить все это заменить

  char newtext[newsize];

на

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

Добавить 0-терминатор перед отъездом:

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

Изменить код вызова с

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

до

  {
    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;
    }
  }
...