Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.60/20: Рейтинг темы: голосов - 20, средняя оценка - 4.60
This party getting crazy!
 Аватар для Bloodykeeper
78 / 64 / 1
Регистрация: 22.09.2009
Сообщений: 427

Запись строк в файл

18.05.2010, 22:26. Показов 4310. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Дан строковый файл. Создать новый строковый файл, содержащий все строки исходного файла наименьшей длины (в том же порядке).

И вторая задача такая же, только строки наибольшей длины.

Вопрос следующий, как реализовать поиск наименьшей или наибольшей строки при работе с файлом? Действует ли здесь функция strlen из библиотеки string.h?? Если можно, то приведите небольшой примерчик. Заранее спасибо.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
18.05.2010, 22:26
Ответы с готовыми решениями:

Запись строк в файл
#define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <conio.h> #include <stdlib.h> #include <string.h> #define size 50 ...

Запись строк в файл
Помогите, Не могу понять, что делает строка: f_in=creat("in.file",S_IWRITE|S_IREAD); while(true) { kol++; ...

Объединение строк и запись в файл
Небольшая задача на C++ состоит в том что из файла t.txt считываются строки, затем заносятся в массив, объединяются и записываются в файл...

21
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,701
18.05.2010, 23:40
Ну алгоритмов может быть несколько. Выигрываем в памяти- проиграем в лаконичности кода. Выграем в лаконичности- проиграем в быстроте... И так далее. Одно за другое цепляется

Можно так:
Считываешь файл в строку
ПРобегаешься по ней циклом. Учти, что коль скоро он текстовый, то конец строки это либо перевод каретки, либо переход на новую строку. То есть символ 0X0d или 0X0A

Ну то есть строка будет представлять из себя нечто такое

d0 e0 f1 f1 f2 f0 e5 eb ff f2 fc 0d 0a e2 f1 e5 f5 0d 0a ea 0d 0a f7 b8 f0 f2 ee e2 ee e9 0d 0a ec e0 f2 e5 f0 e8


Обрати внимание, в конце строки необязатено перевод на другую строку или возврат каретки
...Так, а теперь пробегайся по строке циклом и ищи самую короткую последовательность байтов, куда бы не входили 0d или 0a

В этом примере длина такой последовательности равна 1 (символ ea)

Теперь ищи в этой строке ВСЕ ПОСЛЕДОВАТЕЛЬНОСТИ длиной 1 и перегоняй их в новую строку. Не забывай после каждой ставить 0d 0a

Ну а потом новую строку перегоняй в текстовый файл. Так ты выполнишь первое задание.
1
This party getting crazy!
 Аватар для Bloodykeeper
78 / 64 / 1
Регистрация: 22.09.2009
Сообщений: 427
18.05.2010, 23:55  [ТС]
Как сложно... я никогда не уделял внимания работе с обозначениями букв и цифр в системе. То есть мне нужно будет превратить строку в эти символы...или как? У меня следующая похожая задача, на то, как вы разъясняете, так что мне это будет нужно. Пожалуйста, покажите серединку кода. Как считать строку в файл я знаю, а вот с переводом-проблемка. Большое спасибо!
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
18.05.2010, 23:59
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
/*
*   Дан строковый файл. Создать новый строковый файл, содержащий все строки исходного файла
*   наименьшей длины (в том же порядке).
*/
 
#define FIN_NAME "file.txt"
#define FOUT_NAME "shortest.txt"
 
typedef struct STRING {
    char * buf;
    size_t len;
    struct STRING * next;
} string_t;
 
string_t * new_string(const char * buf, string_t * last){
    string_t * str;
    if ( ( str = (string_t*)malloc(sizeof(string_t)) ) == NULL )
        return NULL;
    if ( ( str->buf = strdup(buf) ) == NULL ){
        free(str);
        return NULL;
    }
    str->len = strlen(str->buf);
    str->next = NULL;
    if ( last )
        last->next = str;
    return str;
}
 
void delete_strings(string_t * str){
    string_t * tmp;
    while ( str ){
        tmp = str->next;
        free(str->buf);
        free(str);
        str = tmp;
    }
}
 
size_t shortest_len(const string_t * str){
    size_t shl = str->len;
    while ( str = str->next )
        if ( str->len < shl )
            shl = str->len;
    return shl;
}
 
int main(void){
    FILE * fin, * fout;
    char buf[BUFSIZ], *p;
    string_t * first, * last;
    size_t len;
 
    if ( ( fin = fopen(FIN_NAME, "r") ) == NULL ){
        perror("fopen");
        exit(EXIT_FAILURE);
    }
 
    first = last = NULL;
 
    while ( fgets(buf, BUFSIZ, fin) ){
        if ( p = strrchr(buf, '\n') )
            *p = '\0';
        if ( *buf == '\0' )
            continue;
        if ( ( last = new_string(buf, last) ) == NULL ){
            fprintf(stderr, "Can't create new string!\n");
            if ( fclose(fin) )
                perror("fclose");
            if ( first )
                delete_strings(first);
            exit(EXIT_FAILURE);
        }
        if ( ! first )
            first = last;
    }
    if ( ferror(fin) ){
        perror("ferror");
        if ( fclose(fin) )
            perror("fclose");
        if ( first )
            delete_strings(first);
        exit(EXIT_FAILURE);
    }
    if ( fclose(fin) )
        perror("fclose");
 
    if ( ! first ){
        fprintf(stderr, "No strings reached!\n");
        exit(EXIT_FAILURE);
    }
 
    len = shortest_len(first);
 
    if ( ( fout = fopen(FOUT_NAME, "w") ) == NULL ){
        perror("fopen");
        delete_strings(first);
        exit(EXIT_FAILURE);
    }
 
    for ( last = first; last != NULL; last = last->next ){
        if ( last->len == len ){
            if ( fprintf(fout, "%s\n", last->buf) == EOF ){
                perror("fprintf");
                if ( fclose(fout) )
                    perror("fclose");
                delete_strings(first);
                exit(EXIT_FAILURE);
            }
        }
    }
 
    delete_strings(first);
 
    if ( fclose(fout) ){
        perror("fclose");
        exit(EXIT_FAILURE);
    }
 
    printf("Done.\n");
    exit(EXIT_SUCCESS);
}
Не спрашивайте, как вторую сделать

Добавлено через 30 минут
Всё-таки поправил, а то не комильфо как-то...
1
This party getting crazy!
 Аватар для Bloodykeeper
78 / 64 / 1
Регистрация: 22.09.2009
Сообщений: 427
19.05.2010, 00:06  [ТС]
Спасибище большое!! теперь в этом бы ещё разобратся...и что именить для превращения задачи во вторую...но это я завтра подумкаю) Я так понимаю - это структура, где мы ещё помимо основной функции создаём дополнительные на удаление строки. А что такое strdup(buf)?
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
19.05.2010, 00:11
Цитата Сообщение от Bloodykeeper Посмотреть сообщение
А что такое strdup(buf)?
А в справочнике посмотреть - не? http://www.freebsd.org/cgi/man... ormat=html
1
This party getting crazy!
 Аватар для Bloodykeeper
78 / 64 / 1
Регистрация: 22.09.2009
Сообщений: 427
19.05.2010, 07:27  [ТС]
Спасибо! А подскажите пожалуйста, если так:

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

то как следует изменить код?? P/S/ это то о чём я писал ранее.

Добавлено через 1 минуту
Д и ещё. Где можно скачать себе такой справочник, как тот, по ссылке выше?
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
19.05.2010, 08:50
Цитата Сообщение от Bloodykeeper Посмотреть сообщение
...в котором строки из исходного файла располагались бы в лексикографическом порядке
Прочитать строки из файла в массив, отсортировать и вывести в файл. На форуме эта задача не раз решалась, ищите.

Цитата Сообщение от Bloodykeeper Посмотреть сообщение
Где можно скачать себе такой справочник, как тот, по ссылке выше?
Любую *NIX систему на комп в качестве ОС установить
1
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,701
19.05.2010, 09:53
ТС,
1) умеешь сортировать строки?
2) Задача: дана строка

C++
1
char stroka []= "stroka simvolov"

Сможешь в этой строке все символы "o" заменить на обой другой, к примеру на d, чтобы получилось:

C++
1
char strdka []= "strdka simvdldv"

3) умеешь работать с динамическим массивом?
1
This party getting crazy!
 Аватар для Bloodykeeper
78 / 64 / 1
Регистрация: 22.09.2009
Сообщений: 427
19.05.2010, 17:31  [ТС]
Прочитать это наверное вот так:

Цитата Сообщение от easybudda Посмотреть сообщение
string_t * new_string(const char * buf, string_t * last){
string_t * str;
if ( ( str = (string_t*)malloc(sizeof(string_t)) ) == NULL )
return NULL;
if ( ( str->buf = strdup(buf) ) == NULL ){
free(str);
return NULL;
return NULL;
if ( ( str->buf = strdup(buf) ) == NULL ){
free(str);
return NULL;[/quote]

Как вывести я знаю, а сортировку не знаю...я вообще болею на эти строки...( Кстати, то ли я кривой, то ли руки такие, но в поиске решения такой задачи я не нашёл...

Добавлено через 3 часа 8 минут
Блин, сегодня пару просидел, думал что нужно изменить в первой задаче, чтобы сделать максимум-поиск. Так и не понял. Не могли бы вы мне объяснить по-подробнее?
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
19.05.2010, 17:51
Цитата Сообщение от Bloodykeeper Посмотреть сообщение
Блин, сегодня пару просидел, думал что нужно изменить в первой задаче, чтобы сделать максимум-поиск. Так и не понял. Не могли бы вы мне объяснить по-подробнее?
Достаточно понять, как в этой программе минимальная длинна строки определяется... Намекну - какая-то из функций для этого применяется...
1
This party getting crazy!
 Аватар для Bloodykeeper
78 / 64 / 1
Регистрация: 22.09.2009
Сообщений: 427
19.05.2010, 17:54  [ТС]
Наверное эта:
C
1
2
3
4
5
6
7
size_t shortest_len(const string_t * str){
        size_t shl = str->len;
        while ( str = str->next )
                if ( str->len < shl )
                        shl = str->len;
        return shl;
}
А как правильно изменить??? Так? :



C
1
2
3
4
5
6
7
size_t longest_len(const string_t * str){
        size_t shl = str-<len;
        while ( str = str-<next )
                if ( str-<len > shl )
                        shl = str-<len;
        return shl;
}
Хотя что-то мне подсказывает, что тут не всё так просто....
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
19.05.2010, 17:59
Цитата Сообщение от Bloodykeeper Посмотреть сообщение
str-<len
Это что?!
C
1
2
3
4
5
6
7
size_t longest_len(const string_t * str){
        size_t lol = str->len; // ;)
        while ( str = str->next )
                if ( str->len > lol )
                        lol = str->len;
        return lol;
}
ну и в main() поменять
C
1
2
3
...
len = longest_len(first);
...
1
This party getting crazy!
 Аватар для Bloodykeeper
78 / 64 / 1
Регистрация: 22.09.2009
Сообщений: 427
19.05.2010, 18:55  [ТС]
Цитата Сообщение от easybudda Посмотреть сообщение
Это что?!
Ооой...и вправду, неувязочка

Добавлено через 42 минуты
Так-с, тут вроде бы разобрался, остался лексиграфический порядок. Подскажите как сделать?? я не знаю как делать сортировку по коду символов. Дайте какую-нить подсказочку.
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
19.05.2010, 19:13
Цитата Сообщение от Bloodykeeper Посмотреть сообщение
Дайте какую-нить подсказочку
#include <string.h>
int strcmp(const char*, const char*)
0
This party getting crazy!
 Аватар для Bloodykeeper
78 / 64 / 1
Регистрация: 22.09.2009
Сообщений: 427
19.05.2010, 19:23  [ТС]
Блин...а как оно работает? в справочнике прочитал про эту функцию, но что-то не могу догнать...В общем я так понял из прошлых задач нам нужно удалить функцию удаления строк, и заменить функцию поиска длиннейшей (кратчайшей) строки, на создание строки в лексиграфическом порядке. Надеюсь, что всё верно...Так вот, как это сделать? всмысле создание лексиграфической строки, ведь функция, которую вы мне предложили нужна только в основной функции?
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,701
19.05.2010, 21:11
Я тоже запутываюсь всё больше и больше.

Тебе нужно сортировать строки. Берёшь какой-нибудь простой алгоритм сортировки ЧИСЕЛ. Елки-палки, можешь сам придумать какой-нибудь простой примитивный алгоритм, разбираешься. РАЗБИРАЕШЬСЯ.

Потом пишешь какую-нибудь маленькую прожку, которая бы сортировала массив чисел.
Потом пытаешься вместо массива чисел сортировать МАССИВ УКАЗАТЕЛЕЙ НА СТРОКИ. Всё. Если не получается- даёшь сюда свою рабочую прожку, которая сортировала бы массив чисел. Подскажем, как переделать её под сортировку массива указателей на строки. Понял? Многого е обещаю, но строки сортировать будешь уметь.

Если понял, тогда внимание: в любом алгоритме сортировки чисел числа СРАВНИВАЮТСЯ МЕЖДУ СОБОЙ. Если ты будешь сортировать строки, то строки тоже должны будешь сравнивать между собой.
Для сравнения строк и существует функция strcmp

Если ты и это понял, если нашёл всё-таки простое и ясное объяснение этой функции в какой-нибудь книге (у тебя ведь есть книги по С, не правда ли?) тогда должен осилить и это:
Опять внимание: в алгоритме сортировки строк сравниваются между собой СТРОКИ, но сортируются УКАЗАТЕЛИ НА НИХ.

Последнее сразу понять необязательно, придёт с опытом. В путь!
1
This party getting crazy!
 Аватар для Bloodykeeper
78 / 64 / 1
Регистрация: 22.09.2009
Сообщений: 427
19.05.2010, 22:51  [ТС]
Хм...я совершенно не понимаю как сортировать строки. Да, вы правы, книги у меня есть, около 200 штук, вот только читать некогда...есть время-читаю. Учёба очень занудная вещь...И за всем не успеваешь. А если использовать функцию:

qsort(имя массива, количество элементов, sizeof(тип), comp)
Или такое применить невозможно? Ну а самую примитивную сортировку?

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/* The Bubble Sort. */
void bubble(char *items, int count)
{
  register int a, b;
  register char t;
 
  for(a=1; a < count; ++a)
    for(b=count-1; b >= a; --b) {
      if(items[b-1] > items[b]) {
        /* exchange elements */
        t = items[b-1];
        items[b-1] = items[b];
        items[b] = t;
      }
    }
}
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,701
19.05.2010, 23:16
На счёт qsort не скажу, не использовал.
...МНе вообще повезло, я начал знакомство с сортировкой не с использования функций, а с разбора их исходников. Второй раз советую тебе так же сделать. Книги есть.

Или так: ты для чего этот код дал? Ты с ним разобрался?
1
This party getting crazy!
 Аватар для Bloodykeeper
78 / 64 / 1
Регистрация: 22.09.2009
Сообщений: 427
19.05.2010, 23:35  [ТС]
Код? по пузырьку всмысле? его я знаю. подробно препод рассказала. Это наверное единственное что она рассказала подробно, если память не подводит. А есть книги по работе с кодом символов? никогда не встречался особо, поэтому даже понятия не имею, как и что сортировать.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
19.05.2010, 23:35
Помогаю со студенческими работами здесь

Запись в файл, состоящий из нескольких строк
мучаюсь все с той же программкой: Есть тестовый файл вида: INLINE : 233 XLINE : 202 668417.50000 565878.00000 995.87421 ...

Запись вектора строк в бинарный файл
Помогите пожалуйста. Компилируется отлично, без ошибок и варнингов, но при запуске выдает ошибку. уже не знаю как быть. не понятно какая...

Запись в файл и вывод из файла строк
Есть две функции: одна записывает дисциплину в файл, другая выводит список дисциплин на экран. Проблема в том, что если название дисциплины...

Запись в текстовый файл адресов вместо строк
Всем привет. Ребята, читаю из бинарного файла структуру и хочу все записать в текстовый файл. Структура struct Client { ...

Чтение строк из файла, объединение и запись в другой файл
Есть текстовый файл в котором записаны несколько строк (строки состоят из 0 и 1). Нужно считать строки из файла и заменить 3 случайных...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru