В исходном текстовом файле первое слово поменять местами со вторым - 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; }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д