我在读取 Windows NT 4.0 dll 文件中的 txt 文件时遇到问题;在你问之前,我目前对将其迁移到新操作系统不感兴趣。我只想解决这个问题,让我之后的其他人担心迁移这个 super 遗留软件。
使用fscanf读取一个txt文件时出现问题,如图:
infile_ptr = fopen("c:\\LumaGem\\orbit.txt", "r");
byteoffset=0;
while(!feof(infile_ptr) )
{
r=0.0; s1=0.0; s2=0.0; e1=0.0; e2=0.0; e3=0.0; d=0.0; f=0.0;
fseek(infile_ptr, byteoffset, SEEK_SET);
fscanf(infile_ptr,"%7lf %7lf %7lf %7lf %7lf %7lf %7lf %7lf", &r, &s1, &s2, &e1, &e2, &e3, &d, &f);
byteoffset=0; byteoffset = ftell(infile_ptr);
}
fclose(infile_ptr);
用 MATLAB 创建的 txt 文件包含 128 行,每行 8 列,由 5 个空格分隔,在 MATLAB 中的格式如下:
fprintf(fid,'%7.3f %7.3f %7.3f %7.3f %7.3f %7.3f %7.3f %7.3f \n', variables);
这段代码不是我写的,并且工作了好几年。然而,最近我们不得不重建/重新安装 Windows NT 4.0 操作系统和软件,现在我得到一个奇怪的错误。该程序使用顶部提供的代码正常读取 txt 文件,直到到达第 123 行,此时它读取第 8 列两次,导致所有后续变量都移动一个位置,完全搞砸了最后一个程序的几行。有趣的是,这个问题可以通过手动将前 123 行批量复制并粘贴到一个新的 txt 文件,然后将最后几行逐行复制到同一个新的 txt 文件并将其用作输入来解决(复制完成在写字板内的 NT 机器上)。这样做消除了这个双重读取问题。我不知道什么问题会导致这个错误,但也让它通过这种奇怪/笨拙的方法来修复。问题发生在新旧输入上,所以我认为输入文件不是问题,因为它们没有改变。
哦,另外,如果我更改 txt 文件中每列之间的空格数,错误的位置就会发生变化。将其减少到 1 个空格会导致错误发生在第 120 行左右,而增加空格数(尝试使用 7 个而不是 5 个)将错误推到第 124 行。
我不是编程专家(一直都是按需学习的人),因此非常感谢帮助解决这个问题。谢谢!
最佳答案
您的 fscanf()
有问题指令。
推荐%lf
而不是 %7lf
.
你的 fprintf()
与 "%7.3f"
使用至少 7 个字符打印 float ,用 ' '
填充根据需要。
您对 "%7lf"
的后续使用在fscanf()
说要扫描最多 7 个字符。因此,当您 printf/scanf 999.999 时,一切正常,但数字更大,例如 1000.007,您的扫描将输入“1000.00”,并将“7”留给下一个 "%7lf"
。 .
int main(void) {
char buf[1000];
double f1, f2;
int r;
sprintf(buf, "%7.3f %7.3f", 1.23, 4.56);
r = sscanf(buf, "%7lf %7lf", &f1, &f2);
printf("'%s'\n%d %g %g\n", buf, r, f1, f2);
sprintf(buf, "%7.3f %7.3f", 999.999, 4.56);
r = sscanf(buf, "%7lf %7lf", &f1, &f2);
printf("'%s'\n%d %.10g %.10g\n", buf, r, f1, f2);
sprintf(buf, "%7.3f %7.3f", 1000.007, 4.56);
r = sscanf(buf, "%7lf %7lf", &f1, &f2);
printf("'%s'\n%d %.10g %.10g\n", buf, r, f1, f2);
return 0;
}
Output:
' 1.230 4.560'
2 1.23 4.56
'999.999 4.560'
2 999.999 4.56
'1000.007 4.560'
2 1000 7
顺便说一句:对于 fscanf()
, "%lf%lf%lf ..."
可以。在 %lf
之间添加空格不会改变功能。
关于c++ - fscanf 双重读取文件中间的变量 - Windows NT 4.0 dll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17753141/