как да получите текст с помощта на fgets и да запазите std::string

Прочетох txt файл с fgets и записах низ

и аз printf_s този низ, но текстът е повреден как мога да поправя този проблем?

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 ред текст

и в този код аз fgets няколко текстови реда в 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