В исходном текстовом файле первое слово поменять местами со вторым - C (СИ)
Формулировка задачи:
Ребята, нужна помощь. Только начал изучать, помогите.
как в си реализовать такую задачу.
В исходном текстовом файле (создать и ввести) первое слово поменять местами со вторым. Дополнительных массивов и файлов не использовать.
Заранее благодарен за ответ.
Листинг программы
- file *fail;
- fail=fopen("test.txt", "w"); //открыли
- if(fail == NULL) //проверили на доступ к файлу
- {
- printf("ERROR");
- exit(0);
- }
- fprintf(fail, "Hello world"); //записали
- //вот как тут не создавая массивов и файлов поменять местами слова.
- fclose(fail);
Решение задачи: «В исходном текстовом файле первое слово поменять местами со вторым»
textual
Листинг программы
- #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;
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д