• B правой части каждого сообщения есть стрелки и . Не стесняйтесь оценивать ответы. Чтобы автору вопроса закрыть свой тикет, надо выбрать лучший ответ. Просто нажмите значок в правой части сообщения.

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

  • Автор темы NicePlant
  • Дата начала
N

NicePlant

Здесь удаляются слова, а как удалить строку? (Си)

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);
}
 
D

DarkKnight

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

DarkKnight

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
    32,1 КБ · Просмотры: 239
D

DarkKnight

Не, разграничение же есть... Указатели они и в этой реализации есть.. Вон смотри Arr - это даже указатель на массив указателей, видишь как много слова указатели ;-))))
А насчет чистого C, вот совсем недавно писал link removed, там чтение по строчно на чистом 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));
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!