Нужно заменить ; на . в тексте в текстовом файле. Также нужно после точки, чтобы слово начиналось с большой буквы. Учитывать также нужно пробелы

Помогите исправить код. Не могу понять как учитывать пробелы и возвести в верхний регистр буквы после точки.

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int main()
{
 FILE* f1, * f2;
 char str[256];
 char* estr;
 f1 = fopen("text1.txt", "rt");
 if (!f1)
 {
  cout << "Cannot open file!";
  return 1;
 }
 f2 = fopen("text2.txt", "wt");
 if (!f2)
 {
  cout << "Cannot open file!";
  return 1;
 }
 else
 {
  cout << "File has opened!";
  while (fgets(str, 256, f1) != NULL)
  {
   estr = fgets(str, 256, f1);
   if (*estr == ';')
   {
    *estr = '.';
   }
   fputs(str, f2);
   for (int i = 0; str[i] != 0; i++)
   {
    if (str[i] <= 'z' && str[i] >= 'a')
    {
     str[i] += 'A' - 'a';
    }
   }
   fputs(str, f2);
  }
 }
 fclose(f1);
 fclose(f2);
 return 0;
}

Ответы (1 шт):

Автор решения: Harry

Я бы исходил из конечного автомата, и делал бы примерно так (набросок на коленке, допускаю, что мог где-то ошибиться или решать неоптимально. stdin замените на входной файл, stdout на выходной).

int c, o, state = 0;
while((c = fgetc(stdin)) != EOF)
{
    o = c;
    if (state == 0)
    {
        if (c == ';') o = '.';
        if (c == ';' || c == '.') state = 1;
    }
    else
    {
        if (c == ';') o = '.';
        if (c == ';' || c == '.' || isspace(c)) state = 1;
        else if (isalpha(c)) { o = toupper(c); state = 0; }
        else state = 0;
    }
    fputc(o,stdout);
}

P.S. Из условия неясно, надо ли, например, менять h на H в ситуации, скажем,

. {"hello"}
→ Ссылка