这有点难以表达,但我希望我的已注释掉的fprintf函数被注释掉,另外两个打印函数被注释掉(在add_to_white_list函数中)。
但是,当我以这种方式(用单词后面的\n)写入文件时,在remove_from_white_list函数中的fgets行读取器出现问题。在调试过程中,fgets读取第一行,之后似乎是空白的。
这可能会让我很困惑,因为所有的东西基本上都是按原样工作的,除了文件中的最后一个单词外,所有单词后面都还有换行符。

void add_to_white_list(char* ip) {
  FILE *fp;
  fp = fopen("../app/whitelist.txt", "r+");

  if (!(getc(fp) < 0)) {
    fseek(fp, 1, SEEK_END);
    fputs("\n", fp);
  }

  fprintf(fp, "%s", ip);
  //fprintf(fp, "%s\n", ip);

  fclose(fp);
}

void remove_from_white_list(char* ip) {
  FILE *fp;
  FILE *fp_temp;
  fp = fopen("../app/whitelist.txt", "r");
  fp_temp = fopen("../app/temp.txt", "w+");

  char buff[255];
  int matched = 0;

  while (fgets(buff, 255, fp) != NULL) {
    strip(buff);
    if (!(strcmp(buff, ip) == 0)) {
        fprintf(fp_temp, "%s\n", buff);
    } else {
      matched = 1;
    }
  }

  fclose(fp);
  fclose(fp_temp);

  if (matched == 0) {
    printf("Please supply an ip address that is currently listed on the whitelist\n");
  } else {
    rename("../app/temp.txt", "../app/whitelist.txt");
  }
}

*我没有包含strip函数,但它删除了\n

最佳答案

这可能无法解决您的问题,但您可以将add_to_white_list简化为:

void add_to_white_list(char* ip) {
   FILE *fp = fopen("../app/whitelist.txt", "a");
   if ( fp != NULL )
   {
      fprintf(fp, "%s\n", ip);
      fclose(fp);
   }
}

10-05 22:42
查看更多