使用 fprintf 写入文件

write into a file with fprintf

我尝试用这个函数写入一个文件。 当我用这一行调用函数时,文件仍然是空的:

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

请帮助我,我不知道该如何解决。 谢谢

两期:

  • 这里

    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-"string".

要解决所有这些问题,请替换

  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] = '[=13=]'; /* 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;
    }
  }