Разбить исходный текст на строки длиной не более 50 символов - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Задание

Разбить исходный текст на строки длиной не более 50 символов. Перенос осуществлять на местах расположения пробельных символов (не разделяя слова на части) Поправьте кто может, чтобы он переносил не каждое слово(максиум, что смог реализовать), а если можно по несколько слов в строку чтобы их сумма символов не превышала 50 и не разрывая слова. Размер текста заранее не известен. Можно использовать вспомогательные матрицы. Пример: он делает так Хотелось бы
/****************************************************************************/
 
#include <stdio.h>
#include <stdlib.h>
FILE *fpIn=NULL,*fpOut=NULL;
 
int main(void)
  {
     char ch,*B;//Символ
     int i=0,j=0,size=0;

     fpIn=fopen("fileIn.txt","r");//Открытие файла для чтения
     fpOut=fopen("fileOut.txt","w");//Открытие файла для записи
     if((fpIn)==NULL) {printf("Ошибка не удалость открыть файл, либо он не создан"); 
       exit(1);
    }
    ch=getc(fpIn);
     while(ch!=EOF) 
     { size++;
       ch=getc(fpIn);
    }

     B=(char*)malloc(sizeof(char)*size);
     
    rewind(fpIn); //перемещаем указатель на символ в начало.
    ch=getc(fpIn);
     printf("Исходный текст:\n");
     while (ch!=EOF)//Пока символ не равен символу конца файла
     {      
        *(B+i)=ch;
    printf("%c",*(B+i));
        i++;
          ch=getc(fpIn);//Считываем очередной символ из файла
      
       } 
       
       printf("Отредактированный текст\n");
       for(i=0;i<size;i++)
       { 
     ch=*(B+i);
     printf("%c",*(B+i));
     if(ch==' ')
     {printf("\n");}
       }

     fclose(fpIn);//Закрытие файла для чтения
     fclose(fpOut);//Закрытие файла для записи
     free(B);
   
     return 0;
  }

Решение задачи: «Разбить исходный текст на строки длиной не более 50 символов»

textual
Листинг программы
#define MAX_LINE_SIZE            (50)
 
static char    pszTemp[MAX_PATH + 1];
 
static int     iSize = 0;
 
static int GetLastSpacePos()
{
   int   iPos = iSize;
 
   while (iPos)
   {
      if (pszTemp[iPos] == ' ')
      {
         return iPos;
      }
 
      --iPos;
   }
 
   return (*pszTemp == ' ')  ?  0  :  -1;
}
 
int main(int argc,char** argv)
{
   FILE*    pIn  = fopen("In.txt", "rt");
 
   if (!pIn)
   {
      // Error !
      return 0;
   }
 
   FILE*    pOut = fopen("Out.txt","wt");
 
   if (!pOut)
   {
      // Error !
      fclose(pIn);
      return 0;
   }
 
   int      iChr  = 0;
 
   while ((iChr = fgetc(pIn)) != EOF)
   {
      // Remove EOL (and empty lines too)
      if ((iChr != '\r') && (iChr != '\n'))
      {
         pszTemp[iSize++] = (char)iChr;
         pszTemp[iSize] = 0; // Ensure ASCIIZ
      }
 
      if (iSize >= MAX_LINE_SIZE)
      {
         int   iSpacePos = GetLastSpacePos();
 
         if (iSpacePos >= 0)
         {
            for (int ii = 0; ii < iSpacePos; ++ii)
            {
               fputc(pszTemp[ii],pOut);
            }
 
            fputc('\n',pOut);
         }
         else // No spaces !
         {
            // Dump ALL !
            if (iSize)
            {
               for (int ii = 0; ii < iSize; ++ii)
               {
                  fputc(pszTemp[ii],pOut);
               }
 
               fputc('\n',pOut);
            }
         }
 
         int   iRest = iSize - iSpacePos;
 
         if (iRest)
         {
            // Remove last space char
            --iRest;
 
            memmove(pszTemp,&pszTemp[iSpacePos + 1],iRest);
            pszTemp[iRest] = 0; // Ensure ASCIIZ
         }
 
         iSize = iRest;
      }
   }
 
   // Dump tail
   if (iSize)
   {
      for (int ii = 0; ii < iSize; ++ii)
      {
         fputc(pszTemp[ii],pOut);
      }
 
      fputc('\n',pOut);
   }
 
   fclose(pIn);
   fclose(pOut);
 
   return 0;
}

Объяснение кода листинга программы

  1. Предопределенный макрос MAX_LINE_SIZE установлен равным 50.
  2. Объявлены статические переменные:
    • pszTemp[MAX_PATH + 1] - буфер для хранения текста, размер MAX_PATH + 1 (чтобы была возможность добавить нулевой символ).
    • iSize - счетчик количества символов в буфере.
  3. Функция GetLastSpacePos() ищет последнее положение пробела в строке.
  4. В функции main():
    • Открывается файл In.txt для чтения (pIn).
    • Если файл не может быть открыт, программа завершается.
    • Открывается файл Out.txt для записи (pOut).
    • Если файл не может быть открыт, файл In.txt закрывается и программа завершается.
  5. В цикле while считывается каждый символ из файла In.txt.
  6. Если символ не является символом новой строки или возврата каретки, он добавляется в буфер.
  7. Если размер буфера достигает MAX_LINE_SIZE, выполняется следующее:
    • Вызывается функция GetLastSpacePos(), чтобы найти последнее положение пробела в строке.
    • Если пробел найден, все символы до него записываются в файл Out.txt, затем добавляется символ новой строки.
    • Если пробел не найден, все символы в буфере записываются в файл Out.txt, затем добавляется символ новой строки.
  8. Если размер буфера меньше MAX_LINE_SIZE, все символы в буфере записываются в файл Out.txt, затем добавляется символ новой строки.
  9. Функция main() завершается, файлы In.txt и Out.txt закрываются.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 3.833 из 5
Похожие ответы