c++ - fscanf 双重读取文件中间的变量 - Windows NT 4.0 dll

标签 c++ c windows scanf windows-nt

我在读取 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/

相关文章:

c++ - 用 C/C++ 中的地址调用 lua 函数?

c++ - QT编译错误

c++ - 编译 x264 的这个 "fixing the build scripts"是什么?

c - 位域中的整数表示

python - Tensorflow 使用 python 在 Windows 中将 .pb 文件转换为 .lite 文件

c++ - Linux/GTK 中的虚拟键盘

c - gets() 在 scanf 之后如何工作?

c - C中的不同撇号

windows - 如何在 Windows 下从我的代码中删除字体?

ruby-on-rails -/sign_in 处的 PG::ConnectionBad 无法连接到服务器:连接但我可以使用 psql 连接