как получить текст с помощью fgets и сохранить std::string

Я читаю текстовый файл с помощью fgets и сохраняю строку

и я печатаю эту строку, но текст не работает, как я могу решить эту проблему?

int main() {    
    char name[256] = "";

    int a = 0, b = 0, c = 0, d = 0;
    FILE *fp = 0;
    fopen_s(&fp, "a.txt", "r");
    if (fp == 0)
    {
        printf_s("can't open this file\n");
        return 0;
    }

    std::string st;
    fgets(name, 256, fp);
    st += name;
    printf_s("%s\n", name);

    fgets(name, 256, fp);
    st += name;
    printf_s("%s\n", name);

    fgets(name, 256, fp);
    st += name; 
    printf_s("%s\n", st, sizeof(st));

    fclose(fp);

    return 0;
}

Текст "a.txt"

привет, мир строка 1 текст текст 2 строка 3 строка текст

и в этом коде я получаю несколько строк текста в char и добавляю этот текст в строку с именем st. могу ли я вставить весь текст использования fgets в строку напрямую?


person D.A.KANG    schedule 01.08.2018    source источник
comment
std::string не c, насколько я знаю. Вы смешиваете c и c++?   -  person kabanus    schedule 01.08.2018
comment
Другое дело, что это кажется смесью C и C++, не указывайте свой file pointer на 0, вы должны указать его на NULL (огромная разница)   -  person Alan    schedule 01.08.2018
comment
Либо вы делаете C, либо у вас нет std::string. Или вы работаете на C++, а что там со всем этим <stdio.h>? Почему fopen() / fgets() / printf() / fclose()?   -  person DevSolar    schedule 01.08.2018
comment
Я выучил c и c++, поэтому путаюсь с использованием.   -  person D.A.KANG    schedule 01.08.2018
comment
Итак, теперь, когда вопрос помечен как C++, я повторяю мой вопрос. Что за код <stdio.h>? Вы должны использовать <iostream> и std::getline.   -  person DevSolar    schedule 01.08.2018


Ответы (1)


Я думаю, что вы ищете немного манипуляции с указателем, но сначала:

  1. Не смешивайте код C++ с вашей программой C — код std::string здесь неуместен.
  2. Не используйте sizeof на string, это может привести к неожиданным последствиям. Длина строки strlen(string), а размер strlen(string)+1.

Чтобы продолжить добавление к name, вы можете использовать что-то вроде:

fgets(name, 256, fp);
fgets(name+strlen(name), 256-strlen(name), fp);
fgets(name+strlen(name), 256-strlen(name), fp); //Repeat (loop?)

Таким образом вы объедините содержимое файла в name. Каждый раз, когда вы передаете указатель, указывающий на предыдущий символ '\0', и перезаписываете его, следя за тем, чтобы вы не читали в общей сложности более 256 символов (255 и '\0').

Лучше убедитесь, что:

  1. fgets завершается успешно и не возвращает NULL.
  2. feof(fp) неверно.
  3. Вы не заполнили name полностью.
person kabanus    schedule 01.08.2018