Задача: Скопировать содержимое текстового файла, удалив самую длинную

Тема в разделе "C/C++/C#", создана пользователем NicePlant, 17 ноя 2010.

  1. NicePlant

    NicePlant Member

    Регистрация:
    3 окт 2010
    Сообщения:
    14
    Симпатии:
    0
    Здесь удаляются слова, а как удалить строку? (Си)

    Код (C++):
    #include <stdlib.h>
    #include <stdio.h>

    void deln (char *pathInput, char *pathOutput)
    {
    int beg, en, max, flag1, flag2, i;
    char c=(* char)calloc(255, sizeof(char));
    FILE *finput;
    FILE *foutput;
    finput=fopen(pathInput, "rt");
    foutput=fopen(pathOutput, "wt");
    beg=0;
    en=0;
    while (!feof(finput))
    {
    max=0;
    flag1=0;
    flag2=0;
    fgets(c, 256, finput);
    if (c[0]=='\n')
    fputc ('\n', foutput);
    for (i=0;c[i]!='\0';++i)
    {
    if ((c[i-1]==' ' || i==0) && c[i]!=' ')
    beg=i;
    if ((c[i+1]==' ' || c[i+1]=='\0') && c[i]!=' ')
    en=i;
    if (en!=0)
    {
    if ((en-beg+1)>max)
    {
    max=en-beg+1;
    flag1=beg;
    flag2=en;
    }
    en=0;
    beg=0;
    }
    }
    for (i=0;c[i]!='\0';++i)
    if (i<flag1 || i>flag2)
    fputc (c[i], foutput);
    }
    }


    void main(void)
    {
    char *pinput;
    char *poutput;
    printf ("Input path of input file: ");
    scanf ("%s", pinput);
    printf ("Input path of output file: ");
    scanf ("%s", poutput);
    worker (pinput, poutput);
    }
     
  2. DarkKnight

    DarkKnight Well-Known Member
    C\C++ Team

    Регистрация:
    1 авг 2010
    Сообщения:
    653
    Симпатии:
    0
    Со строками все гораздо проще и веселей...
    Смысл читаем все строки в строковый массив char Arr[][]...
    Прогоняем весь массив и ищим Arr[?], strlen(Arr[?]) - длина строки самая большая выводим все в выходной файл пропуская эту строку....
    Щас накидаю код...
     
  3. DarkKnight

    DarkKnight Well-Known Member
    C\C++ Team

    Регистрация:
    1 авг 2010
    Сообщения:
    653
    Симпатии:
    0
    Код (C++):
    /*
    codeby.net
    Autor: DarkKnight125
    */

    #include <iostream>
    #include <fstream> //Потоковый файловый ввод-вывод

    using namespace std;

    void main(void)
    {
    setlocale(LC_ALL,"Russian");
    char Arr[100][1025]; //Предположим что файл точно не более 100 строк и длина строки не более 1024
    //*можно динамику применить конечно, но это затруднит понимание*
    ifstream filein("C:/Arr1.txt"); //Откроем файл
    if (!filein){
    cout<<"Входной файл не найден"<<endl;
    return;
    }

    int strcnt = 0; //Счетчик строк файла
    while ( !filein.eof() )
    {
    filein.getline(Arr[strcnt],1024); //Читаем строку из файла
    strcnt++; //Увеличим счетчик
    }
    filein.close(); //Закроем файловый дескриптор

    cout<<"ВХОДНОЙ ФАЙЛ :"<<endl;
    int PosMaxLen = -1; //Позиция с макс. строкой
    unsigned int Maxlen = 0;
    for (int i=0; i<strcnt; i++) //Пройдемся по всем строкам массива
    {
    if (strlen(Arr[i]) > Maxlen) //Если длина текущей строки больше длины_максимальной, то
    {
    Maxlen = strlen(Arr[i]); //Присвоем новое значение
    PosMaxLen = i; //Присвоим новое значение позиции макс. строки
    }
    cout<<Arr[i]<<endl; //Выводим на экран входной файл
    }

    ofstream fileout("C:/arr2.txt");
    cout<<endl<<"ВЫХОДНОЙ ФАЙЛ :"<<endl;
    for (int i =0; i<strcnt; i++) //Обойдем опять весь массив строк, и будем писать все
    {
    if (i != PosMaxLen) //Кроме индекса PosMaxLen
    {
    fileout.write(Arr[i],strlen(Arr[i]));
    fileout.put('\n');
    cout<<Arr[i]<<endl;
    }
    }
    fileout.close(); //Закроем дискриптор файла

    }
     

    Вложения:

    • topic39213.jpg
      topic39213.jpg
      Размер файла:
      79,4 КБ
      Просмотров:
      45
  4. NicePlant

    NicePlant Member

    Регистрация:
    3 окт 2010
    Сообщения:
    14
    Симпатии:
    0
    Вот мне и надо все через динамику, одни указатели.
    (Си)
     
  5. DarkKnight

    DarkKnight Well-Known Member
    C\C++ Team

    Регистрация:
    1 авг 2010
    Сообщения:
    653
    Симпатии:
    0
    Не, разграничение же есть... Указатели они и в этой реализации есть.. Вон смотри Arr - это даже указатель на массив указателей, видишь как много слова указатели ;-))))
    А насчет чистого C, вот совсем недавно писал http://codeby.net/ipb.html?s=&sh...st&p=190684, там чтение по строчно на чистом C-реализованно.... Ну а дальше все как я в примере (см. выше) описал.... Ну и запись в выходной файл поменяешь тоже на FILE

    Добавлено: А про динамику... Ну выдели переменную Arr
    Код (C++):
    char **Arr;
    Arr = (char**)malloc(1000*sizeof(char*));
    int i; 
    for (i = 0; i<1000; i++)
    Arr[i] = (char*)malloc(1024*sizeof(char));
     
  6. NicePlant

    NicePlant Member

    Регистрация:
    3 окт 2010
    Сообщения:
    14
    Симпатии:
    0
    Сейчас попробую...))
    СПС)
    +1)
     
  7. NicePlant

    NicePlant Member

    Регистрация:
    3 окт 2010
    Сообщения:
    14
    Симпатии:
    0


    А что тут происходит?
     
  8. DarkKnight

    DarkKnight Well-Known Member
    C\C++ Team

    Регистрация:
    1 авг 2010
    Сообщения:
    653
    Симпатии:
    0
    Выделяешь память для сторки (массива символов)
     
Загрузка...
Похожие Темы - Задача Скопировать содержимое
  1. Янчик
    Ответов:
    0
    Просмотров:
    490
  2. TrishaRay
    Ответов:
    1
    Просмотров:
    783
  3. elzim
    Ответов:
    0
    Просмотров:
    932
  4. ShaoKahn
    Ответов:
    0
    Просмотров:
    1.128
  5. eremin-sanek
    Ответов:
    3
    Просмотров:
    1.108

Поделиться этой страницей