c++ - 如何使用 fseek() 进入一行的开头

标签 c++ c file scanf fseek

我有一个函数,用于检查传递的参数是否与 .dat 文件中的参数相匹配,并在误差范围内。

我想做的是找到最佳匹配。因此,我阅读了整个文件并跟踪给我最匹配的那一行。在我完成读取文件后,我想返回到该特定行并将其作为我的最终结果进行读取。

但是,我不能做那个“回去”的部分。

我的职能是:

int isObjectMatches(FILE *rPtr, struct objectDatabaseList *db, double area, double length)
{
    double sum;
    errno_t err;
    double const errorThreshold = 0.4;
    double minError = 100.0;
    int lineNo = 0, bestMatchNo = 0;
    bool match = false;

    if ((err = fopen_s(&rPtr, "objects.dat", "r")) != 0)
        printf("Couldn't open the file to read.\n");
    else
    {
        rewind(rPtr);
        while (fscanf_s(rPtr, "%14s%lf%lf", db->dName, sizeof db->dName, &db->dArea, &db->dLength) == 3)
        {
            lineNo++;
            sum = pow((1 - (area / db->dArea)), 2) + pow((1 - (length / db->dLength)), 2);

            if (sum > errorThreshold) // No possible match
            {
                continue; // Keep reading
            }
            else
                if (sum < minError) // One possible match
                {
                    minError = sum;
                    bestMatchNo = lineNo; // Take the line number
                    match = true;
                    continue; // Keep reading
                }               
        }

        if (match)
        {
            fseek(rPtr, (bestMatchNo - 1)*sizeof(struct objectDatabaseList), SEEK_SET); // Find the line
            fscanf_s(rPtr, "%14s%lf%lf", db->dName, sizeof db->dName, &db->dArea, &db->dLength);
            fclose(rPtr);
            return 0;
        }
    }
    fclose(rPtr);
    return -1;
}

我的结构是:

struct objectDatabaseList
{
    char dName[15];
    double dArea;
    double dLength;
};

请注意,一行的长度不是固定数字,因为“名称”可能不同。

最佳答案

我会使用 ftell 获取每行开头的偏移量,然后使用 fgets 读取该行并使用 sscanf 解析该行>.

关于c++ - 如何使用 fseek() 进入一行的开头,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33455391/

相关文章:

c - 如何确定 fgets 是否在读取所有字母之前停止?

iphone - 我们如何从 url 下载 sqlite 数据库并将其作为 sqlite 数据库添加到我们的应用程序中?

ios - 我的 Xcode 项目中没有任何内容是可编辑的?

c++ - 以编程方式检查应用程序正在使用的核心数

c++ - 覆盖非虚函数和虚函数有什么区别?

c++ - 使用非常量值初始化的对 const 类成员的引用

c - C中的0.5++是什么

c - 获取小数分隔符后面的数字

c++ - send() 函数返回所需的更多字节 C++

java - 如何将多个对象写入文件?