IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

 
 Ответить  Открыть новую тему 
> Сортировка строк в файле в алфавитном порядке, Сортировка в С++
сообщение
Сообщение #1


Пионер
**

Группа: Пользователи
Сообщений: 103
Пол: Мужской
Реальное имя: Александр

Репутация: -  0  +


Добрый вечер, необходимо написать программу которая сортирует строки в файле в алфавитном порядке.
Код программы:

laba3::sortirovka()
{
FILE *f;
char str={0};
char s1[79]={0};
char s2[79]={0};
int i=0,j=0,k=0;
int flag=1;
long pos1=0,pos2=0;
int length=0;
int flag_perest=0;
int flag_flag=0;
fpos_t filepos;
f=fopen ("laba3.txt","r+");
do
{
//f=fopen ("laba3.txt","r+");
if (flag_perest==1)
{
for (i=0;i<79;i++)
{
//s1[i]='\0';
s2[i]='\0';
}
}
else
{
for (i=0;i<79;i++)
{
flag_flag=1;
pos1=0;
pos2=0;
s1[i]='\0';
s2[i]='\0';
}
}
i=0;
j=0;
if ((flag==1)&&(flag_perest==0))
{
//flag=0;
if (flag_flag!=1)
pos1=ftell(f);
fseek(f,pos2,pos1);
do
{
str=fgetc(f);
if (str!=' ')
{
s1[i]=str;
i++;
}

if ((i==80) || (feof(f)))
{
break;
}

}
while (str!=' ');
} //endif;

//pos=fgetpos(f,&filepos);
//pos=fseek(f,ftell(f),SEEK_CUR);
pos2=ftell(f);
fseek(f,pos2,po1);
do
{

str=fgetc(f);
if ((str!=' ')&&(!feof(f)))
{
s2[j]=str;
j++;
}
if ((feof(f))||(j==80))
{
break;
}
}
while (str!=' ');

if ((strlen(s1)) <= (strlen(s2))) // <=
{
k=j;
}
if ((strlen(s1)) > (strlen(s2)))
{
k=strlen(s1);
flag=1;
}
//i=j=0;

for (int m=0;m<k;m++)
{
if (s1[m]>s2[m])
{
flag=1;
break;
}
}

k=0;

/*if ((strlen(s1)) < (strlen(s2)))
{
length=strlen(s2);
}
else
{
length=strlen(s1);
} */

if (flag==1)
{
fseek(f,pos1,0);
do
{
fputc(s2[k],f);
k++;
}
while (k!=strlen(s2));

fputc(' ',f);
k=0;
do
{
fputc(s1[k],f);
k++;
}
while (k!=strlen(s1));
}
if (flag==0)
{
flag_perest=1;
}
else
{
flag_perest=0;
}
//fclose(f);
}
while (!feof(f));
fclose(f);
return 0;
}


Язык С++. Идея сортировки такая, берется первое слово и сранивается со всеми, затем если нужно слова переставляются, и цикл начинается заново и так пока не достигнется конец файла, затем берется 2е слово и сранивается с отсальными и т.д.
Писал программу, но запутался с функцией fseek(); т.е 1е слово со всеми сравнивается, а вот чтобы взять затем 2е не получается. И 2я проблема есть ли какая-нибудь функция удаления и смещения символов в файле, т.е например если в файле 2 строки klmno и abc то при перестановке получается abcno klmno.

Заранее благодарен за помощь.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Брррр... А что, сортировку обязательно написать самому, воспользоваться тем, что есть уже готовое в языке (если уж речь про С++ - то там это точео есть) - нельзя?

 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Пионер
**

Группа: Пользователи
Сообщений: 103
Пол: Мужской
Реальное имя: Александр

Репутация: -  0  +


Конечно можно, так даже будет удобней, я недавно начал си изучать, подскажите есть ли метод какой, или функция?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






Ты пример файла приведи, с которым работаешь...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Пионер
**

Группа: Пользователи
Сообщений: 103
Пол: Мужской
Реальное имя: Александр

Репутация: -  0  +


Пример файла

sdfsdfsdfsdfsf
fwfsdfsdf
sdfwefs
sdfwefwefwef
erwerwer
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






#include <algorithm>
#include <iostream>
#include <fstream>
#include <iterator>
#include <vector>
#include <string>

int main()
{
std::string s;
std::vector<std::string> lines;

// читаем файл в контейнер построчно
std::ifstream in_file("laba3.txt", std::ios::in);
while(getline(in_file, s))
lines.push_back(s);
in_file.close();

std::sort(lines.begin(), lines.end()); // сортируем контейнер

// и записываем отсортированный контейнер в новый файл
std::vector<std::string>::iterator i = lines.begin();
std::ofstream out_file("laba31.txt", std::ios::out);
for(; i != lines.end(); ++i)
out_file << *i << std::endl;
out_file.close();
return 0;
}

 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Пионер
**

Группа: Пользователи
Сообщений: 103
Пол: Мужской
Реальное имя: Александр

Репутация: -  0  +


Добрый день, Владимир спасибо огромное только это ведь язык С, если не ошибаюсь? А мне нужно на C++
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


Вы путаете C и С++. Вам нужен просто C (судя по 1му посту), а решение вам привели на C++. Неужели не видно, что раз есть навороты типа std::vector<std::string>, значит, это "плюсы"?


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Гость






Цитата
Вам нужен просто C (судя по 1му посту)
Ага... Особенно - судя вот по этой части первого поста:
Цитата
laba3::sortirovka()
, правда? Ну прям вылитый С. С классами только с какого-то перепуга...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Пионер
**

Группа: Пользователи
Сообщений: 103
Пол: Мужской
Реальное имя: Александр

Репутация: -  0  +


В 1м посте я писал программу на консольном С++. а класс я сам объявлял.
Я впринцыпе нашел программу реализующую сортировку, но разрбраться пока сложновато, если Вам не трудно можете добавить коментарии к строкам, примерно представляю как она работает, но не до конца, как я понял тут сначала загружается все строки в динамическую память, затем сортируются, если ошибаюсь поправте. И еще такой вопрос что означает символ ' * ' это ссылка на область памяти? т.е это равносильно паскалевсому '^' ? и если пишут несколько ** как это понять? Спасибо за помощь.

scmp(const void *p1, const void *p2)
{
const char *s1, *s2;

s1 = * (char **) p1;
s2 = * (char **) p2;
return strcmp(s1, s2);
}

laba3::sortirovka()
{
FILE *ifp, *ofp;
laba3 l;
char *lineptr[MAXLINE];
char s[MAXLINE];
int i, nl;
clrscr();
ifp = fopen(IFNAME, "r");
if(ifp == NULL || (ofp = fopen(OFNAME, "w")) == NULL) {
perror("fopen");
return -1;
}

for(i = 0; i < MAXLINE; ) {
if(fgets(s, sizeof(s), ifp) == NULL)
break;
if(*s != '\n')
lineptr[i++] = strdup(s);
}

nl = i;
qsort(lineptr, nl, sizeof(char *), scmp);

for(i = 0; i < nl; i++) {
fprintf(ofp, "%s", lineptr[i]);
free(lineptr[i]);
//fputc('\n',ofp);
}
fclose(ifp);
fclose(ofp);
cout << "file otsortirovan";
getch();
return 0;

}
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Гость






Цитата
В 1м посте я писал программу на консольном С++. а класс я сам объявлял.
Ты для себя сначала реши, ты хочешь С или С++? Потому как та гремучая смесь, что есть у тебя сейчас - это ни то ни другое. Чистый С - значит без классов, с использованием вот этих многоэтажных *** и приведений типов (иногда безопасных, иногда - не очень). Если С++ - то классы, использование потоков вместо файлов, и использование стандартной библиотеки (STL).

Тот код, который ты привел - вообще не будет компилироваться ни одним из современных С++ компиляторов (без внесения исправлений).
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


Цитата(volvo @ 11.05.2010 18:20) *

Ага... Особенно - судя вот по этой части первого поста:
, правда? Ну прям вылитый С. С классами только с какого-то перепуга...


Всё, кроме первой строчки - чистый C вообще-то, а что?

Цитата

и если пишут несколько ** как это понять?

Ну * это не обязательно просто указатель. Иногда это указатель на массив, иногда это строка, иногда это просто способ передать параметр по ссылке.
Например в фразе proc(char *** c) тройная звёздочка может просто означать массив строк, переданный по ссылке.
В коде сортировки (char **) - это указатель на строку.


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Гость






Цитата
Всё, кроме первой строчки - чистый C вообще-то

"- Осетрину прислали второй свежести, - сообщил буфетчик.
- Голубчик, это вздор!
- Чего вздор?
- Вторая свежесть - вот что вздор! Свежесть бывает только одна - первая, она же последняя. А если осетрина второй свежести, то это означает, что она тухлая!"

(С) М.А. Булгаков, "Мастер и Маргарита"


Применительно к специфике форума - перефразирую: А как компилятору-то объяснить, чтоб он первую строку воспринимал, как С++, а остальные - как С? Или, пардон, программа должна быть написана, а будет она компилироваться и работать - это уж не особо важно? Так вот, рассказываю: программа из первого поста не будет компилироваться как С++ (причины - тривиальны: не иметь возвращаемого значения может только конструктор, все остальные методы его обязаны иметь; и небезопасное сравнение знаковых/беззнаковых типов, которое трактуется как ошибка) так и Plain C - компилятором (ибо ни неймспейсов ни классов в чистом С нет).
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14


Пионер
**

Группа: Пользователи
Сообщений: 103
Пол: Мужской
Реальное имя: Александр

Репутация: -  0  +


Программа вроде работает, я просто путаюсь с С и С++, точнее даже не знаю в чем отличия, смотрю вроде код похожий беру и использую если работает, то хорошо, сейчас просто сессия надо быстрей сдавать времени нету, поэтому абы как и делаю.... Летом буду разбираться что да как, Спасибо за помощь.

Вот сама программа:
Прикрепленный файл  laba.rar ( 1.53 килобайт ) Кол-во скачиваний: 395
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 31.10.2020 16:08
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name