Переписать строки файла в обратном порядке в другой файл по отношению к порядку строк - 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;
}
Объяснение кода листинга программы
- Включаем заголовочный файл glib.h для использования функций и типов Glib.
- Определяем строки с именами файлов для чтения и записи.
- Функция my_strreverse() используется для переворачивания строки.
- В функции main() открываем файл для чтения и создаем пустой канал вывода.
- Создаем пустой стек для хранения строк из файла.
- Читаем файл построчно и добавляем каждую строку в конец стека.
- Закрываем вводный канал.
- Открываем файл для записи.
- Переворачиваем каждую строку из стека и записываем ее в файл.
- Закрываем файл вывода.
- Освобождаем память, выделенную под строки в стеке.
- Возвращаем 0, чтобы указать, что программа успешно завершилась.