C读取conf文件

时间:2017-08-08 12:22:46

标签: c file

你好我尝试读取conf文件(逐行)时遇到问题

这是我的代码:

bool EndWith(const char* haystack, const char* needle)
{
    bool rv = 0;
    if (haystack && needle)
    {
        size_t needle_size = strlen(needle);
        const char* act = haystack;
        while (NULL != (act = strstr(act, needle)))
        {
            if (*(act + needle_size) == '\0')
            {
                rv = 1;
                break;
            }
            act += needle_size;
        }
    }

    return rv;
}
    FILE *file2 = fopen ("config.conf", "r");
    const size_t line_size = 300;
    char* line = malloc(line_size);
    while (fgets(line, line_size, file2) != NULL)  {
        puts(line);

        if(EndWith(line, "toto")) {
            puts("yes");
        }
    }

和我的conf文件:

vm.user_reserve_kbytes = 131072 toto
vm.vfs_cache_pressure = 100 toto
vm.zone_reclaim_mode = 0 toto

我的代码返回2“是”,但如果我的conf文件,如果我在第一行添加换行符,我读取我的3行,我的代码返回3“是” 为什么?

我想返回3“是”而无需在我的配置文件的第0行添加换行符

错误重播:

vm.user_reserve_kbytes = 131072 toto

yes
vm.vfs_cache_pressure = 100 toto

yes
vm.zone_reclaim_mode = 0 toto

正确退货(添加换行符)

yes
vm.user_reserve_kbytes = 131072 toto

yes
vm.vfs_cache_pressure = 100 toto

yes
vm.zone_reclaim_mode = 0 toto

我测试了解决方案FilipKočica(感谢您的帮助),但我有同样的问题:

代码:

bool EndWith(const char* haystack, const char* needle)
{
    if (haystack == NULL || needle == NULL)
    {
        return false;
    }
    const char* p;
    if ((p = strstr(haystack, needle)) != NULL)
    {
        if (!strcmp(p, haystack + strlen(haystack) - strlen(needle)))
        {
            return true;
        }
    }
    else
    {
        return false;
    }
    return false;
}



int main(int argc, char **argv)
{
        FILE *file2 = fopen ("config.conf", "r");
        const size_t line_size = 300;
        char* line = malloc(line_size);
        while (fgets(line, line_size, file2) != NULL)  {
            puts(line);

            if (EndWith(line, "za"))
            {
                puts("it does.");
            }

        }



        return 0;
}

我的文件config.conf:

vm.user_reserve_kbytes = 131072 za
vm.vfs_cache_pressure = 1001 za
vm.zone_reclaim_mode = 01 za

1 个答案:

答案 0 :(得分:1)

1]

它返回2,因为最后一行没有以换行符\n结束。

每次调用getline时,它都会从文件中提供一行(如果有另一行)。 无需检查此行是否真的以NL字符结束。 只需计算getline没有返回EOF的次数。

puts超出条件

while (fgets(line, line_size, file2) != NULL)
{
    puts(line);
    puts("yes");

    if(EndWith(line, /*special strings*/ ))
    {

    }
}

2]

bool EndWith(const char* haystack, const char* needle)
{
    if (haystack == NULL || needle == NULL)
    {
        return false;
    }
    const char* p;
    if ((p = strstr(haystack, needle)) != NULL)
    {
        if (!strcmp(p, haystack + strlen(haystack) - strlen(needle) - 1))
        {
            return true;
        }
    }
    else
    {
        return false;
    }
    return false;
}



int main(int argc, char **argv)
{
        FILE *file2 = fopen ("config.conf", "r");
        const size_t line_size = 300;
        char* line = malloc(line_size);
        while (fgets(line, line_size, file2) != NULL)  {
            if (EndWith(line, "za"))
            {
                puts("it does.");
            }

            puts(line);
        }



        return 0;
}

配置文件:

vm.user_reserve_kbytes = 131072 za
vm.vfs_cache_pressure = 1001 za
vm.zone_reclaim_mode = 01 za

输出:

it does.
vm.user_reserve_kbytes = 131072 za

it does.
vm.vfs_cache_pressure = 1001 za

it does.
vm.zone_reclaim_mode = 01 za