Выравнивание текста в файле по левому краю - C (СИ)

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

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

Доброго времени суток уважаемые програмисты. я писал программу, которая делает выравнивание по левому краю т.е. убирает лишние пробелы непойму в чем ошибка... помогите зарание спасибо
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>          //Тут определена функция CharToOem(char, char) - она нам очень нужна.
                                   //Дело в том, что ввод текста программы производится в редакторе MS Visual Studio C++ (кодовая страница 1251),
                                   //а вывод сообщений на экран в консольном режиме (кодовая страница 866),
                                   //поэтому вместо русского текста выводятся кракозяблики (кодовая страница не та).
                                   //Переопределение кодовой страницы консоли SetConsoleOutputCP(1251) как в Borland C в MS естественно не сработало,
                                   //поэтому используем перекодировку сообщений в 866 страницу заранее, используя CharToOem(char, char),
                                   //которая перекодирует ANSI (1251) в OEM (866). OemToChar делает обратную операцию.
 
#include <conio.h>            //А тут определена функция getch().
                                   //Эта функция возвращает в программу символ, нажатый юзером на клавиатуре.
 
#define  maxLines     100     //Максимальное количество строк во входном файле (ну не больше же ста строк будет в учебном файле ...)
 
//============================================================================================================================================
//функция *open4rd: открыть файл для чтения, 
//если такого файла нет - создать и принять текст с клавиатуры
FILE *open4rd(char *fName)
{     //========================================= русификация вывода в консоль =================================================================
     char messg1[]="Файл не найден   - ";                                   CharToOem(messg1, messg1);
     char messg2[]="Введите путь и имя файла: ";                            CharToOem(messg2, messg2);
     char messg3[]="Недопустимое имя файла - ";                             CharToOem(messg3, messg3);
     char messg4[]="Файл успешно создан - ";                                CharToOem(messg4, messg4);
     char messg5[]="Введите текст с клавиатуры (eof - конец ввода):";       CharToOem(messg5, messg5);
     char messg6[]="Пытаемся создать - ";                                   CharToOem(messg6, messg6);
 
     //========================================= переменные модуля ============================================================================
     char txtLine[1024];                    // это строка для ввода с клавиатуры
     FILE *pFile;                 // это входной и выходной файлы
     long i;                                // это счетчик строк во вводимом файле
     char fNameWin[255];                    // это путь и имя файла в кодировке 1251
 
     //========================================= НАЧАЛО ПРОГРАММЫ =============================================================================
 
     pFile = fopen (fName, "r");               //попытка открытия на чтение с именем по умолчанию
     if (pFile == NULL)                        //если файл не найден, введем его с клавы
     {     printf("\n%s%s\n%s\n", messg1, fName, messg2);
 
          gets(fName);                          //запрос имени файла, 
          OemToChar(fName, fNameWin);          //перекодировка имени из страницы консоли 866 в страницу windows 1251
          pFile = fopen (fNameWin, "r");     //попытка открытия на чтение с введенным именем
 
          if (pFile == NULL)                    //если нет указанного юзером файла, будем его создавать
          {     printf("%s'%s'\n%s'%s'\n", messg1, fName, messg6, fName);
               
               while ( (pFile=fopen(fNameWin, "w")) == NULL )    //
               {     printf("%s '%s'\n", messg3, fName);         //крутимся здесь, пока не создадим файл,
                    gets(fName); OemToChar (fName,fNameWin);     //у которого допустимое имя
               }                                                 //
               printf("%s '%s'\n%s\n", messg4, fName, messg5);
 
               for (i=1; i< maxLines; i++)     //вводим много строк, но не бесконечно много
               {     gets(txtLine);               //эта функция построчно читает с клавы
                    if ( txtLine[0]!= 'e' && txtLine[1]!= 'o' && txtLine[2]!= 'f')
                    {fprintf(pFile, "%s\n", txtLine);} //пишем в файл
                    else break;                    //если введено "eof", окончить ввод
               }
               system("cls");                         //почистить экран после окончания ввода текста файла
               fclose(pFile);                         //закрыть файл, а то он на запись открыт был
               pFile = fopen(fNameWin, "r");     //открыть на чтение, при этом происходит сброс указателей
          }
          OemToChar(fName, fName);               //запомним допустимое имя в кодировке 1251
     return pFile;                         
}
 
FILE *pFile, *textOut;                           //это исходный и результирующий файлы
     char txtLine[200];                          //это строка из файла
     long i=0;                                   //это явное объявление позиции внутри строки
 
     pFile = open4rd(fName);                                         // вывести для юзера
     while((fgets(txtLine, sizeof(txtLine), pFile))!=NULL)           // на экран
     {printf("%s", txtLine);}                                        // файл с исходным текстом
     fclose(pFile);                                                  //
     
     pFile   = open4rd(fName);                                       //
     textOut = fopen ( defResult, "w");                              //
     while((fgets(txtLine, sizeof(txtLine),  pFile ))!=NULL)         // выровнить по левому краю (удаление лишних пробелов)
     {                                                               // и записать результат
          i=0; while(txtLine[i] == ' ') {i++;}                       // в третий файл
          fprintf( textOut, "%s", txtLine+i );                       // defaultResult.txt
     }                                                               //
     fclose(pFile);  fclose(textOut);                                //

     textOut = fopen (defResult, "r");                              // вывести для юзера на экран
     while((fgets(txtLine, sizeof(txtLine), textOut))!=NULL)        // файл с результирующим 
     {printf( "%s", txtLine);}                                      // (выровненным по левому краю) 
     fclose(textOut);                                               // текстом

Решение задачи: «Выравнивание текста в файле по левому краю»

textual
Листинг программы
    if (!(txtLine[0] == 'e' && txtLine[1] == 'o' && txtLine[2] == 'f'))

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


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

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

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