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

Fortran结合FCGI与sqlite3开发时字符串write输出异常问题

问题排查及解决方案

以下是导致该问题的常见原因及对应修复方案:

  • 字符串末尾隐含C风格空终止符\0
    你调用的sqlite3接口为C实现,返回的字符串默认末尾带\0作为终止符。如果给json_o赋值时将末尾的\0也计入了字符串长度,Fortran的print*输出时会自动截断到\0之前的内容,所以控制台输出正常,但fcgi输出时会将\0也写入返回体,浏览器解析JSON时遇到空字符会判定内容非法,导致无内容展示。
    排查方法:打印len(json_o)与肉眼可见的字符串长度对比,如果前者比后者大1,说明确实多了末尾的\0,赋值后添加json_o = json_o(1:len(json_o)-1)去掉最后一位即可。
  • AFORMAT格式化符适配问题
    多数fcgi封装库的AFORMAT预定义为固定长度的字符串格式(例如'(A1024)'),输出可分配字符串时如果实际长度小于格式指定长度,会自动补充大量空格,破坏JSON的合法格式。
    解决方法:放弃使用预定义的AFORMAT,直接使用通用动态长度格式输出:write(unitNo, '(A)') json_o
  • 宿主作用域可分配变量访问异常
    部分旧版本Fortran编译器对内部子程序访问宿主作用域的可分配字符变量存在适配bug,会读取到错误的内存地址,导致输出为空。
    解决方法:将json_o作为参数显式传入respond子程序,或者在respond内部先将json_o赋值给局部固定长度字符串后再输出。
  • scratch文件指针未重置
    每次调用fcgip_put_file后文件指针会停在文件末尾,下一次写入前如果没有重置指针位置,新内容会追加到文件末尾,而fcgi返回时只会读取文件开头到上一次写入的截止位置,导致新内容不会被返回。
    解决方法:在respond子程序的写入操作前添加rewind(unitNo),将文件指针重置到文件开头。

内容的提问来源于stack exchange,提问作者John C.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 20:24:05