Переписать строки файла в обратном порядке в другой файл по отношению к порядку строк - C (СИ)

Узнай цену своей работы

Формулировка задачи:

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

Желательно в си

Надо чтобы было:

исход:

12345 23456 34567 45678 56789

Получилось:

98765 87654 76543 65432 54321 Могу только поменять символы:
#include "stdafx.h"
#include <iostream>
#include <Windows.h>
#include <wincon.h>
#include <conio.h>
#include <cstdio>
int _tmain(int argc, _TCHAR* argv[])
{
    FILE *F1, *F2;
    char ch, sl[1000], sl2[1000], c;
    if ((fopen_s(&F1, "1.txt", "r")) != 0)
    {
        printf("Невозможно открыть файл.\n");
        return 0;
    }   
    if ((fopen_s(&F2, "2.txt", "w+")) != 0){
        printf("Невозможно открыть файл.\n");
        return 0;
    }
 while (!feof(F1))
    {
        int N, i;
        fgets(sl, 1000, F1);
        N = strlen(sl); 
 
        i = N;
        for (i = N - 1; i > 0; i--)
            if (sl[i] != '\n')
                fprintf(F2, "%c", sl[i]);
 
        fprintf(F2, "%c", sl[0]);
        fprintf(F2, "%c", '\n');
    }
   fclose(F1); 
  fclose(F2);
    return 0;
}

Решение задачи: «Переписать строки файла в обратном порядке в другой файл по отношению к порядку строк»

textual
Листинг программы
/* ANSI C 99 */
 
#include <glib.h>
 
#define INPUT_FILE_NAME "in.txt"
#define OUTPUT_FILE_NAME "out.txt"
 
char * my_strreverse(char * str) {
    char * head, * tail, tmp;
    
    for ( head = tail = str; *tail && *tail != '\n'; ++tail )
        ;
    
    for ( --tail; head < tail; ++head, --tail ) {
        tmp = *head;
        *head = *tail;
        *tail = tmp;
    }
    
    return str;
}
 
int main(void) {
    GError * err = NULL;
    GIOChannel * input = g_io_channel_new_file(INPUT_FILE_NAME, "r", &err);
    if ( ! input ) {
        g_print("%s\n", ( err ) ? err->message : "Can't open input file!");
        return 1;
    }
    
    GSList * stack = NULL;
    GString * str = g_string_new("");
    GIOStatus status;
    
    while ( ( status = g_io_channel_read_line_string(input, str, NULL, &err) ) == G_IO_STATUS_NORMAL )
        stack = g_slist_prepend(stack, g_strdup(str->str));
    
    if ( status != G_IO_STATUS_EOF ) {
        g_print("%s\n", ( err ) ? err->message : "Unexpected end of input file!");
        return 1;
    }
    
    g_io_channel_close(input);
    
    GIOChannel * out = g_io_channel_new_file(OUTPUT_FILE_NAME, "w", &err);
    if ( ! out ) {
        g_print("%s\n", ( err ) ? err->message : "Can't open output file!");
        return 1;
    }
    
    gsize writen;
    for ( GSList * iter = stack; iter; iter = iter->next ) {
        if ( g_io_channel_write_chars(out, my_strreverse(iter->data), -1, &writen, &err) != G_IO_STATUS_NORMAL ) {
            g_print("%s\n", ( err ) ? err->message : "Unexpected end of output file!");
            return 1;
        }
        g_free(iter->data);
    }
    
    g_io_channel_close(out);
    g_slist_free(stack);
    g_string_free(str, TRUE);
    
    return 0;
}

Объяснение кода листинга программы

  1. Включаем заголовочный файл glib.h для использования функций и типов Glib.
  2. Определяем строки с именами файлов для чтения и записи.
  3. Функция my_strreverse() используется для переворачивания строки.
  4. В функции main() открываем файл для чтения и создаем пустой канал вывода.
  5. Создаем пустой стек для хранения строк из файла.
  6. Читаем файл построчно и добавляем каждую строку в конец стека.
  7. Закрываем вводный канал.
  8. Открываем файл для записи.
  9. Переворачиваем каждую строку из стека и записываем ее в файл.
  10. Закрываем файл вывода.
  11. Освобождаем память, выделенную под строки в стеке.
  12. Возвращаем 0, чтобы указать, что программа успешно завершилась.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 4.071 из 5
Похожие ответы