【问题标题】:fscanf failing in this C codefscanf 在此 C 代码中失败
【发布时间】:2012-06-12 20:31:16
【问题描述】:

因此,作为一名新实习生,我需要修复其中一些人编写的许多脏代码。这是一个 sn-p,我在弄清楚确切的问题是什么时遇到了一点问题:

for (i=0; i<TOOL_LIMIT; i++)
        {
                if ( 0 >= fscanf(fp,"%s %s %s %s %s %s %s\n",coreData[i][0],\
coreData[i][1],coreData[i][2],coreData[i][3],coreData[i][4],coreData[i][5], coreData[i][6]))
                {
                        break;
                }
                totalCases++;
        }
        fclose(fp);

基本上,fp 会打开一些具有以下正则表达式模式的文件:

data11 data12 data13 data14...data17
data21 data22 data23 data24...data27
...

我觉得这段代码也没有按照预期的方式工作。基本上,它假设读取文件的每一行,并填写数组 coreData,如图所示。我不认为 fscanf 像这里显示的那样工作,但我可能是错的。 这段代码是否正常工作?好久没用c做文件io了。

编辑;; 对不起,应该简要概述一下失败。 基本上,C 脚本是一个 cgi 脚本,它接受一些输入(有错误的文件)并将这些文件与 fp 打开的文件(称为“fp_file”)中的数据进行匹配,并生成一个 html 表。如果有错误的文件出现在 fp_file 中,那么它会打印一些额外的信息(如 data12 等),否则它将将该表中的条目留空。 例子 发现文件f01有错误 我们现在检查 fp 中的“f01”,如果它存在,我们会显示有关该文件(作者等)的更多信息。

我看到的是只有一个文件被正确匹配(fp 的第一行)。除此之外,其余的错误文件都有一个空格。

【问题讨论】:

  • coreData 的类型是什么? fscanf 的返回值是多少?调用fscanfcoreData 变量的值是多少?如果您能提供一个 smallcomplete 测试用例,将会有所帮助——请参阅sscce.org
  • 我编辑了它是如何失败的。我正在使用示例文件作为测试。我有一种感觉,它没有超过第一行
  • 你是凭感觉调试的?你是绝地武士吗?还是移情?
  • 大声笑,我做了一些调试。我用不同的行替换了第一行,并且正确匹配的原始文件不再匹配。在我们说话的时候,我还在调试。有没有更好的逐行读取文件的方法?
  • 是的,我建议使用 fgets 读取文件的整行,然后使用 sscanf 从单行读取到各个字段。

标签: c file-io scanf


【解决方案1】:

此代码读取以空格分隔的六个单词为一组,并将它们存储在 coreData 数组中。

我认为只要输入行有六个由空格分隔的单词,它就可以工作。您可以稍微加强条件,并在 fscanf 返回一个不同于 6 的值(fscanf 返回成功读取的元素数)时立即退出循环。

【讨论】:

  • 抱歉,我打错了,文件每行正好有 7 个字,现在 fscanf 反映了这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-15
  • 2015-12-30
  • 2011-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-29
相关资源
最近更新 更多