Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
кирилл8526
0 / 0 / 0
Регистрация: 03.01.2016
Сообщений: 20
1

В исходном текстовом файле первое слово поменять местами со вторым

03.01.2016, 23:08. Просмотров 856. Ответов 3
Метки нет (Все метки)

Ребята, нужна помощь. Только начал изучать, помогите.

как в си реализовать такую задачу.

В исходном текстовом файле (создать и ввести) первое слово поменять местами со вторым. Дополнительных массивов и файлов не использовать.

C
1
2
3
4
5
6
7
8
9
10
11
12
file *fail;
fail=fopen("test.txt", "w"); //открыли 
if(fail == NULL) //проверили на доступ к файлу
{
printf("ERROR");
exit(0);
}
fprintf(fail, "Hello world"); //записали
 
//вот как тут не создавая массивов и файлов поменять местами слова. 
 
fclose(fail);
Заранее благодарен за ответ.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.01.2016, 23:08
Ответы с готовыми решениями:

Поменять местами первое и второе слово строки
Ввести предложение и поменять местами его первые два слова. Я написал код, но...

Поменять местами первое и второе число в файле
Нельзя использовать другие массивы и файлы. Интересует конкретно сама замена...

Дано предложение. Поменять местами его первое и последнее слово
Часть 1. Дан числовой массив. Реализовать алгоритм сортировки подсчётом. ...

Дано предложение. Поменять местами его первое и последнее слово
Не знаю как записать во вторую переменную последнее слово. Помогите пожалуйста...

Строка символов. Поменять местами первое и последнее слово в строке
Есть задание: Дана строка символов. Поменять местами первое и последнее слово в...

3
GoldenSpice
4 / 4 / 6
Регистрация: 14.10.2015
Сообщений: 26
04.01.2016, 02:18 2
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

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
#include <iostream>
#include <stdio.h>
 
// только для ASCII-слов
int main(void)
{
    FILE* fp = fopen("test.txt", "w+t");
    if(fp == NULL) //проверили на доступ к файлу
    {
        printf("ERROR");
        return 0;
    }
    fprintf(fp, "Hello world"); //записали
    fclose(fp);
    fp = fopen("test.txt", "rt+"); //редактируем
    if(fp == NULL) //проверили на доступ к файлу
    {
        printf("ERROR");
        return 0;
    }
    int  a, b;
    long pa, pb, la, lb;
 
    //позиция 1-ого слова
    fscanf(fp, "%*[^a-zA-Z]");
    pa = ftell(fp);
    fscanf(fp, "%*[a-zA-Z]");
    la = ftell(fp) - pa;
 
    // позиция 2-ого слова
    fscanf(fp, "%*[^a-zA-Z]");
    pb = ftell(fp);
    fscanf(fp, "%*[a-zA-Z]");
    lb = ftell(fp) - pb;
 
    // посимвольная перезапись(обмен)
    for(long i = (la < lb) ? la : lb; i > 0L; --i){
        fseek(fp, pa, SEEK_SET);
        a = fgetc(fp);
 
        fseek(fp, pb, SEEK_SET);
        b = fgetc(fp);
        fseek(fp, -1L, SEEK_CUR);
        fputc(a, fp);
        pb = ftell(fp);
 
        fseek(fp, pa, SEEK_SET);
        fputc(b, fp);
        pa = ftell(fp);
    }
 
    //если 2-ое слово больше 1-oго
    long ia, ib;
    if(lb > la) {
        --pa;
        for(long i = lb - la; i > 0L; --i, ++pa, ++pb) {
             ib = pb;
             fseek(fp, pb - 1, SEEK_SET);
             while(pa < ib) {
                  a = fgetc(fp);
                  b = fgetc(fp);
                  fseek(fp, -2L, SEEK_CUR);
                  fputc(b, fp);
                  fputc(a, fp);
                  fseek(fp, -3L, SEEK_CUR);
                  ib = ftell(fp);
             }
       }
 
    } else if(la > lb) { // если 1-ое слово больше 2-oго
 
        for(long i = la - lb; i > 0L; --i) {
             ia = pa;
             fseek(fp, pa, SEEK_SET);
             while(ia < pb - 1) {
                 a = fgetc(fp);
                 b = fgetc(fp);
                 fseek(fp, -2L, SEEK_CUR);
                 fputc(b, fp);
                 fputc(a, fp);
                 fseek(fp, -1L, SEEK_CUR);
                 ia = ftell(fp);
            }
       }
    }
 
    fclose(fp);
    return 0;
}
0
кирилл8526
0 / 0 / 0
Регистрация: 03.01.2016
Сообщений: 20
04.01.2016, 18:57  [ТС] 3
А можно с коментами. Я только начал изучать и не все еще понимаю. Если не трудно, помогите с коментами к каждой строке. СПАСИБО БОЛЬШОЕ
0
GoldenSpice
4 / 4 / 6
Регистрация: 14.10.2015
Сообщений: 26
06.01.2016, 21:45 4
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

кирилл8526,
Не совсем полностью. Вообще, всю информацию можно найти в интернете.
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
#include <iostream>
#include <stdio.h>
 
// только для ASCII-слов
int main(void) 
{
    FILE* fp = fopen("test.txt", "w+t"); //создаем указатель на файл и тут же отрываем его функццией fopen (char *filename, char *mode); w+t - открытие для чтения и записи в текстовом режиме, если файл существует, то его содержимое теряется.
    if(fp == NULL) //проверили на доступ к файлу
    {
        printf("ERROR"); // сообщение об ошибке
        return 0; // конец программы
    }
    fprintf(fp, "Hello world"); //записали
    fclose(fp); // закрыли редактирование файла
    fp = fopen("test.txt", "rt+"); //редактируем rt+ - открыть файл для чтения и записи, файл должен существовать.
    if(fp == NULL) //проверили на доступ к файлу
    {
        printf("ERROR");// сообщение об ошибке
        return 0; // конец программы
    }
    int  a, b;              // объявление
    long pa, pb, la, lb;    // переменных
 
    //позиция 1-ого слова
    fscanf(fp, "%*[^a-zA-Z]");
    pa = ftell(fp); // Возвращает значение указателя на текущую позицию файла. В случае ошибки возвращает число (-1).
    fscanf(fp, "%*[a-zA-Z]");
    la = ftell(fp) - pa;
 
    // позиция 2-ого слова
    fscanf(fp, "%*[^a-zA-Z]");
    pb = ftell(fp); // Возвращает значение указателя на текущую позицию файла. В случае ошибки возвращает число (-1).
    fscanf(fp, "%*[a-zA-Z]");
    lb = ftell(fp) - pb;
 
    // посимвольная перезапись(обмен)
    for(long i = (la < lb) ? la : lb; i > 0L; --i){
        fseek(fp, pa, SEEK_SET); // установка указателя на некоторую заданную позицию в файле функцией fseek(). 
        a = fgetc(fp);
 
        fseek(fp, pb, SEEK_SET);
        b = fgetc(fp);
        fseek(fp, -1L, SEEK_CUR);
        fputc(a, fp); // Функция fputc() записывает символ ch в текущую позицию потока stream, a затем увеличивает указатель текущей позиции файла
        pb = ftell(fp);
 
        fseek(fp, pa, SEEK_SET);
        fputc(b, fp);
        pa = ftell(fp);
    }
 
    //если 2-ое слово больше 1-oго
    long ia, ib;
    if(lb > la) {
        --pa;
        for(long i = lb - la; i > 0L; --i, ++pa, ++pb) {
             ib = pb;
             fseek(fp, pb - 1, SEEK_SET);
             while(pa < ib) {
                  a = fgetc(fp);
                  b = fgetc(fp);
                  fseek(fp, -2L, SEEK_CUR);
                  fputc(b, fp);
                  fputc(a, fp);
                  fseek(fp, -3L, SEEK_CUR);
                  ib = ftell(fp);
             }
       }
 
    } else if(la > lb) { // если 1-ое слово больше 2-oго
 
        for(long i = la - lb; i > 0L; --i) {
             ia = pa;
             fseek(fp, pa, SEEK_SET);
             while(ia < pb - 1) {
                 a = fgetc(fp);
                 b = fgetc(fp);
                 fseek(fp, -2L, SEEK_CUR);
                 fputc(b, fp);
                 fputc(a, fp);
                 fseek(fp, -1L, SEEK_CUR);
                 ia = ftell(fp);
            }
       }
    }
 
    fclose(fp);
    return 0;
}
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.01.2016, 21:45

Поменять местами первый и последний элементы в текстовом файле
Имеется структура: struct list {int num; // номер char author;...

Поменять местами первое и последнее слово в строке без использования указателей
Как я понял нужно использовать пробел как разделитель слов, но как это...

Поменять местами первое и последнее слово строки, если слова разделены пробелами
есть вот это, но что то помоему это не на с++ #include &lt;conio.h&gt; #include...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru