fscanf_s从文本文件中随机读取行,仅读取4行

我有一个要按顺序检查的数据集,但是fscanf_s()和我编写的使用fgetc()的函数都只读取了我数据集中乱序的4行。当我的数据集之一为空或fscanf_s()或我的个人函数返回EOF时,我终止使用这些值的循环。

我尝试测试它在哪条线取消,但是每次都是随机的。我寻找了一些类似的问题,但其中大多数只是说要使用fgets或fgetc,然后解析我已经使用我的个人功能进行的操作。

{% load socialaccount %}

我希望这段代码可以遍历整个数据集,然后重置文件,以使其在每次完整浏览数据集后的第一个字符处出现。

digohao 回答:fscanf_s从文本文件中随机读取行,仅读取4行

虽然您没有提供A Minimal,Complete,and Verifiable Example (MCVE),但是在修复"%[^\n]"并将其设置为"%lf"之后,代码的直接问题是您正在限制读循环的结尾在status1 != EOF && status2 != EOF上。直到您尝试通过在达到EOF之后尝试printf的{​​{1}}值来调用未定义行为后,X,Y都不是。

此外,将循环设为EOF会忽略在达到EOF之前可能导致的 matching input 失败。相反,您总是根据成功转换次数(即返回的数值)来验证EOF(在您的情况下为scanf)是成功还是失败。这就是为什么评论中提到您Why is while ( !feof (file) ) always wrong?的原因。

最好根据数字返回值来控制读取循环,例如

f_scanf

或简单地连续循环直到其中一个失败,例如

    while (fscanf_s (data_input,"%lf",&X) == 1 &&
            fscanf_s(data_output,&Y) == 1) {

鉴于您要完成的任务,可以执行类似以下操作:

while (1) {
    ...
    status1 = fscanf_s (data_input,&X);
    if (status1 != 1) {
        if (status1 == EOF) {
            fputs ("status1-EOF\n",stderr);
            break;
        }
        else if (status1 == 0) {
            fputs ("matching or input failure.\n",stderr);
            /* matching or input failure occurred,* handle as appropriate (clear to '\n' or break).
             */
        }
    }

注意:最后,您的double update_weights_v2 (LOGISTIC_MODEL hModel,FILE* data_input,FILE* data_output) { Model* pModel = (Model*)hModel; double X,Y,error = 0,prediction,W1_deriv = 0,W2_deriv = 0; int n = 0; while (fscanf_s (data_input,&Y) == 1) { prediction = pModel->activation(X,pModel->W1,pModel->W2); error = Y - prediction; W1_deriv += (X * error * pModel->rate); W2_deriv += (error*pModel->rate); n++; printf ("Input: %.5lf\nOutput: %.5lf\nGuess: %.5lf\nError: %.5lf\n" "Weight[1]: %.5lf\nWeight[2]: %.5lf\n" "***********************************************************\n",X,error,pModel->W2); } rewind(data_input); rewind(data_output); return error; } 将掩盖函数中设置的流状态-可能正是您想要的,也可能掩盖数据文件中的问题在您下次致电rewind()时会再次咬你)

要进一步提供帮助,我们将需要A Minimal,and Verifiable Example (MCVE)

,

尽管有很多有用的答案,但解决此问题的原因是vs代码中未显示一行。无论出于什么原因,我都无法查看应该限制程序显示的输出量的行,从而不会因我的模型的每一次猜测而向控制台发送垃圾邮件。更新后我重新加载了vs代码,并且该行返回了。我不知道为什么会这样,但是现在有意义。

谢谢。

本文链接:https://www.f2er.com/3164042.html

大家都在问