Разбить исходный текст на строки длиной не более 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; }
Объяснение кода листинга программы
- Предопределенный макрос MAX_LINE_SIZE установлен равным 50.
- Объявлены статические переменные:
- pszTemp[MAX_PATH + 1] - буфер для хранения текста, размер MAX_PATH + 1 (чтобы была возможность добавить нулевой символ).
- iSize - счетчик количества символов в буфере.
- Функция GetLastSpacePos() ищет последнее положение пробела в строке.
- В функции main():
- Открывается файл
In.txt
для чтения (pIn). - Если файл не может быть открыт, программа завершается.
- Открывается файл
Out.txt
для записи (pOut). - Если файл не может быть открыт, файл
In.txt
закрывается и программа завершается.
- Открывается файл
- В цикле while считывается каждый символ из файла
In.txt
. - Если символ не является символом новой строки или возврата каретки, он добавляется в буфер.
- Если размер буфера достигает MAX_LINE_SIZE, выполняется следующее:
- Вызывается функция GetLastSpacePos(), чтобы найти последнее положение пробела в строке.
- Если пробел найден, все символы до него записываются в файл
Out.txt
, затем добавляется символ новой строки. - Если пробел не найден, все символы в буфере записываются в файл
Out.txt
, затем добавляется символ новой строки.
- Если размер буфера меньше MAX_LINE_SIZE, все символы в буфере записываются в файл
Out.txt
, затем добавляется символ новой строки. - Функция main() завершается, файлы
In.txt
иOut.txt
закрываются.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д