0

Дублируется длина, где должна быть 10 - 100, где 11 - 111

Дублируется длина, где должна быть 10 - 100, где 11 - 111. Но с однозначными длинами все в порядке.

//функция обработки содержимого файла
void obrabotka_file(char* fname_i, char* fname_r)
{
    FILE* in, * out;        //исходный и результирующий файлы (потоки)
    char st_in[RAZ];        //обрабатываемая строка
    char st_out[RAZ];       //результирующая строка
    vector <char>* v;
    char* p = new char(RAZ);    //указатель на выделенное слово
    in = fopen(fname_i, PR_R);      //открываем файл на чтение
    out = fopen(fname_r, PR_W); //открываем файл на запись
    fgets(st_in, RAZ, in);      //читаем первую строку из файла in
    while (!feof(in))           //пока не найден признак конца файла
    {
        st_out[0] = '\0';           //очищаем результирующую строку
        p = strtok(st_in, " \n");   //выделяем первое слово (лексему).
        while (p)               //Пока очередное слово выделено
        {
            //обрабатываем слово
            strcat(st_out, p); //добавляем слово к результату
            string s = to_string(strlen(p));
            for (int j = 0; j < s.length(); j++)
                strcat(st_out, &s[j]);           
                strcat(st_out, " "); //добавляем пробел между слов
                p = strtok(NULL, " \n");        //выделение последующих слов
    }//while(p)
    st_out[strlen(st_out) - 1] = '\0';  //последний символ нулевой
    if (strlen(st_out))             //если строка не пустая
        fprintf(out, &quot;%s\n&quot;, st_out);   //записываем строку в новый файл
    fgets(st_in, RAZ, in);          //считываем новую строку из файла
}//while(!feof(in))
fclose(in);         //Закрываем файл in
fclose(out);            //Закрываем файл out

}

Bukashka
  • 21
  • 5
  • полнее код покажите, чтобы проверить. не видно типов переменных и т.д. – AlexGlebe Sep 18 '21 at 10:12
  • char* p = new char(RAZ); - память все для одной буквы. – AlexGlebe Sep 18 '21 at 10:27
  • st_out[strlen(st_out) - 1] = '\0'; - зачем вы удаляете последнюю букву ? – AlexGlebe Sep 18 '21 at 10:30
  • удаляю последний пробел – Bukashka Sep 18 '21 at 10:33
  • а можно как-то более простым методом вставить длину слова за лексемой? – Bukashka Sep 18 '21 at 10:34
  • вот тут strcat(st_out, &s[j]); основная ошибка (в цикле много раз дописываете все символы от j-го до конца строки) – avp Sep 18 '21 at 10:37
  • Кстати, какой формат слов вы вообще хотите получить? – avp Sep 18 '21 at 10:38
  • главное, чтобы вывод был, как на примере в скриншоте, только с верной длиной слова – Bukashka Sep 18 '21 at 10:41
  • 1
    Просто используйте sprintf в цикле -- int l = 0; while (p) {l += sprintf(st_out + l, "%s%d ", p, strlen(p)); p = strtok(NULL, " \n");} – avp Sep 18 '21 at 10:53
  • тогда из строки слов (111 222 333 44444) функция будет выводить в массив только последнее (444445) – Bukashka Sep 18 '21 at 11:04
  • @Bukashka, нет, всегда будет добавлять после уже выведенного. Вы не обратили внимания на изменение адреса строки-приемник в цикле l += sprintf(st_out + l, ...) (и не помните, что sprintf возвращает количество выведенных байт) – avp Sep 18 '21 at 13:02

1 Answers1

1

А вы не хотите немного проще?

void obrabotka_file(const char* fname_i, const char* fname_r)
{
    FILE* in, * out;        //исходный и результирующий файлы (потоки)
    in = fopen(fname_i, "rt");      //открываем файл на чтение
    out = fopen(fname_r, "wt"); //открываем файл на запись
if (!in || !out) { fprintf(stderr,&quot;File error\n&quot;); return; }

for(int counter = 0, c, state = 0; (c = fgetc(in)) != EOF; fputc(c,out))
    if (isspace(c))
    {
        if (state == 1)
        {
            fprintf(out,&quot;%d&quot;,counter);
            counter = 0;
            state = 0;
        }
    }
    else
    {
        counter++;
        state = 1;
    }
fclose(in);         //Закрываем файл in
fclose(out);            //Закрываем файл out

}

Harry
  • 221,325