C читать файл Conf
Здравствуйте, у меня есть проблема, когда я пытаюсь прочитать файл 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 "Да" без необходимости добавлять перевод строки в line0 моего файла conf
возвращение ошибки:
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
я проверил решение Filip Koč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 ответ
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