GnuPlot 无法读取编译的 C 代码生成的数据(在 Windows 10 电脑上)。
编辑: 实际问题是 Windows PowerShell 环境强制执行的字符编码。
这是我的(大大简化用于测试)数据文件“data1”
0.0000e+00 0.0000e+00
5.0000e-01 2.5000e-01
这是由
制作的#include <stdio.h>
void main()
{
double x=0.0 , y=0.0;
printf("%.4e %.4e\n",x,y);
x=0.5; y=x*x;
printf("%.4e %.4e\n",x,y);
}
在 Visual Studio Code 1.84.2(使用 gcc 的 MSYS2 版本 12.2.0)上编译成我称之为“SPAM”的可执行文件。在 Windows power shell 的该目录中,我调用
.\SPAM > data1
。
编辑: 罪魁祸首是 Windows PowerShell,它通过重定向字符 > 将输出编码为 UTF-16 LE BOM。
使用 GnuPlot 5.4(补丁级别 8)给我带来了这个麻烦:
gnuplot> plot 'data1'
^
Bad data on line 1 of file data1
直接使用
plot '-'
输入这些数据效果很好。
使用Notepad++查看数据文件没有显示隐藏或特殊字符。
将数据文件的内容复制粘贴到新文件中即可解决问题!
但我不能复制我的所有(实际上巨大)数据文件。
问题:编辑: 实际问题不是这些——而是 Windows PowerShell 强制执行的编码。
“普通”命令 shell
cmd.exe
生成大小为 46 字节的 ASCII 文本。因此我建议使用
cmd.exe
而不是Powershell来运行命令
.\SPAM > data1
。或者编写运行此命令的批处理脚本,可以从 Powershell 运行批处理脚本。
更新:
根据这个超级用户答案,您还可以从Powershell运行此命令:
.\SPAM | Out-File -Encoding ascii data1
https://unix.stackexchange.com/questions/171832/converting-a-utf-8-file-to-ascii-best-effort
建议通过 iconv 传输数据:
.\SPAM | iconv -c -f utf-8 -t ascii//TRANSLIT > data1
或者,我从你的评论中认为:
.\SPAM | iconv -c -f UTF-16LE -t ascii//TRANSLIT > data1
如果您的系统上存在 iconv,那么这应该可以工作。 -c 丢弃无法用 ASCII 表示的字符。我刚刚注意到,如果你在 Win 10 中通过 TYPE 传输数据,它似乎会转换为 ASCII:
.\SPAM >data0
TYPE data0 >data1
简单,如果可行的话。