用fprintf写入文件

时间:2018-10-20 12:28:16

标签: c string dynamic-memory-allocation c-strings local-variables

我尝试使用此功能写入文件。 当我用这一行调用函数时,文件仍然为空:

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 :(得分:0)

两个问题:

  • 在这里

    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)的地址。内存仅在函数内部有效。

    函数返回内存的那一刻会自动释放。返回函数后访问它会调用臭名昭著的Undefined Behaviour。此刻什么都可能发生。不要这样做。

  • 函数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;
    }
  }