![]() |
1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!
![]() ![]() |
![]() |
ninja |
![]()
Сообщение
#1
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 103 Пол: Мужской Реальное имя: Александр Репутация: ![]() ![]() ![]() |
Добрый вечер, необходимо написать программу которая сортирует строки в файле в алфавитном порядке.
Код программы: 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. Заранее благодарен за помощь. |
volvo |
![]()
Сообщение
#2
|
Гость ![]() |
Брррр... А что, сортировку обязательно написать самому, воспользоваться тем, что есть уже готовое в языке (если уж речь про С++ - то там это точео есть) - нельзя?
|
ninja |
![]()
Сообщение
#3
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 103 Пол: Мужской Реальное имя: Александр Репутация: ![]() ![]() ![]() |
Конечно можно, так даже будет удобней, я недавно начал си изучать, подскажите есть ли метод какой, или функция?
|
volvo |
![]()
Сообщение
#4
|
Гость ![]() |
Ты пример файла приведи, с которым работаешь...
|
ninja |
![]()
Сообщение
#5
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 103 Пол: Мужской Реальное имя: Александр Репутация: ![]() ![]() ![]() |
Пример файла
sdfsdfsdfsdfsf fwfsdfsdf sdfwefs sdfwefwefwef erwerwer |
volvo |
![]()
Сообщение
#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;
}
|
ninja |
![]()
Сообщение
#7
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 103 Пол: Мужской Реальное имя: Александр Репутация: ![]() ![]() ![]() |
Добрый день, Владимир спасибо огромное только это ведь язык С, если не ошибаюсь? А мне нужно на C++
|
TarasBer |
![]()
Сообщение
#8
|
![]() Злостный любитель ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: ![]() ![]() ![]() |
Вы путаете C и С++. Вам нужен просто C (судя по 1му посту), а решение вам привели на C++. Неужели не видно, что раз есть навороты типа std::vector<std::string>, значит, это "плюсы"?
-------------------- |
volvo |
![]()
Сообщение
#9
|
Гость ![]() |
Цитата Вам нужен просто C (судя по 1му посту) Ага... Особенно - судя вот по этой части первого поста:Цитата laba3::sortirovka()
|
ninja |
![]()
Сообщение
#10
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 103 Пол: Мужской Реальное имя: Александр Репутация: ![]() ![]() ![]() |
В 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; } |
volvo |
![]()
Сообщение
#11
|
Гость ![]() |
Цитата В 1м посте я писал программу на консольном С++. а класс я сам объявлял. Ты для себя сначала реши, ты хочешь С или С++? Потому как та гремучая смесь, что есть у тебя сейчас - это ни то ни другое. Чистый С - значит без классов, с использованием вот этих многоэтажных *** и приведений типов (иногда безопасных, иногда - не очень). Если С++ - то классы, использование потоков вместо файлов, и использование стандартной библиотеки (STL).Тот код, который ты привел - вообще не будет компилироваться ни одним из современных С++ компиляторов (без внесения исправлений). |
TarasBer |
![]()
Сообщение
#12
|
![]() Злостный любитель ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: ![]() ![]() ![]() |
Ага... Особенно - судя вот по этой части первого поста: , правда? Ну прям вылитый С. С классами только с какого-то перепуга... Всё, кроме первой строчки - чистый C вообще-то, а что? Цитата и если пишут несколько ** как это понять? Ну * это не обязательно просто указатель. Иногда это указатель на массив, иногда это строка, иногда это просто способ передать параметр по ссылке. Например в фразе proc(char *** c) тройная звёздочка может просто означать массив строк, переданный по ссылке. В коде сортировки (char **) - это указатель на строку. -------------------- |
volvo |
![]()
Сообщение
#13
|
Гость ![]() |
Цитата Всё, кроме первой строчки - чистый C вообще-то "- Осетрину прислали второй свежести, - сообщил буфетчик. - Голубчик, это вздор! - Чего вздор? - Вторая свежесть - вот что вздор! Свежесть бывает только одна - первая, она же последняя. А если осетрина второй свежести, то это означает, что она тухлая!" (С) М.А. Булгаков, "Мастер и Маргарита" Применительно к специфике форума - перефразирую: А как компилятору-то объяснить, чтоб он первую строку воспринимал, как С++, а остальные - как С? Или, пардон, программа должна быть написана, а будет она компилироваться и работать - это уж не особо важно? Так вот, рассказываю: программа из первого поста не будет компилироваться как С++ (причины - тривиальны: не иметь возвращаемого значения может только конструктор, все остальные методы его обязаны иметь; и небезопасное сравнение знаковых/беззнаковых типов, которое трактуется как ошибка) так и Plain C - компилятором (ибо ни неймспейсов ни классов в чистом С нет). |
ninja |
![]()
Сообщение
#14
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 103 Пол: Мужской Реальное имя: Александр Репутация: ![]() ![]() ![]() |
Программа вроде работает, я просто путаюсь с С и С++, точнее даже не знаю в чем отличия, смотрю вроде код похожий беру и использую если работает, то хорошо, сейчас просто сессия надо быстрей сдавать времени нету, поэтому абы как и делаю.... Летом буду разбираться что да как, Спасибо за помощь.
Вот сама программа: ![]() |
![]() ![]() |
![]() |
Текстовая версия | 17.07.2025 22:23 |