You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言文件写入、字符串操作异常求助:printf正常但文件无内容

问题分析与解决

核心问题:文件写入无内容

控制台能正常输出localhost:8080,但../tmp.txt无写入内容,根源有两点:

  1. 文件流未刷新/关闭:fprintf属于带缓冲的IO操作,数据可能暂存于用户态缓冲区,未同步到磁盘。代码中未调用fflush强制刷新,也未关闭文件(fclose会自动刷新缓冲区)。
  2. 文件打开模式非法:"arw+"不是标准的fopen模式,标准模式中a(追加)与r+(读写)混用会导致行为不确定,应改用"a+"(追加读写)或"w+"(覆盖读写)。

修复后的problematic_write函数

void *problematic_write (void *arg) {
  char *host_match = (char *)arg;
  // 使用标准追加读写模式
  FILE *tmp_host = fopen("../tmp.txt", "a+");
  if (tmp_host == NULL) {
    printf("Something went wrong creating file!");
    exit(EXIT_FAILURE);
  }
  printf("%s", host_match);
  fprintf(tmp_host, "%s", host_match);
  // 强制刷新缓冲区到磁盘
  fflush(tmp_host);
  // 关闭文件,释放资源同时确保数据落盘
  fclose(tmp_host);
  // 线程函数需返回合法值
  free(host_match); // 释放malloc分配的内存,避免泄漏
  return NULL;
}

字符串操作潜在隐患

你在创建host_match时存在几个可优化/修复的点:

  • 内存分配冗余:malloc(host_len)分配的空间大于实际需求,应直接分配host_len - 5(有效字符长度host_len-6 + 终止符'\0')。
  • 内存泄漏风险:host_match通过malloc分配,但未释放,需在线程函数末尾添加free(host_match)。
  • 越界读取风险:使用%.*s时需确保clientbuffer_main从start_index+6开始有足够的字符,避免越界。

修复后的字符串创建与线程调用代码

start_index = match_2[0].rm_so;
host_len = (match_2[0].rm_eo) - start_index;
// 分配刚好足够的内存:有效字符数 + 终止符
host_match = malloc(host_len - 5);
if (host_match == NULL) {
    perror("malloc failed");
    exit(EXIT_FAILURE);
}
sprintf(host_match, "%.*s", host_len - 6, &clientbuffer_main[start_index + 6]);
host_match[host_len - 6] = '\0';
pthread_create(&thread_id, NULL, problematic_write, (void *)host_match);
pthread_join(thread_id, NULL);

其他类似问题的通用排查方向

针对文件复制/写入无内容、字符串操作异常但printf正常的情况,可从以下几点排查:

  • IO缓冲机制:带缓冲IO(如fprintf/fwrite)需手动fflush或fclose确保数据落盘;无缓冲的系统调用write则无此问题。
  • 字符串终止符:printf能输出不代表字符串有合法的'\0'终止符,多数字符串操作函数(如strcpy、fprintf的%s)依赖终止符,缺失会导致读取垃圾数据或提前截断。
  • 内存越界:malloc空间不足会导致字符串拼接溢出,破坏内存结构,可借助valgrind工具检测。
  • 线程安全:多线程操作同一文件/字符串时,需加互斥锁避免竞争条件。

内容的提问来源于stack exchange,提问作者kagami

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 18:10:23