Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.03.2017, 23:45   #1
AndreyR32
Новичок
Джуниор
 
Регистрация: 07.12.2013
Сообщений: 1
По умолчанию Файловое чтение/запись (обратный порядок)

Требуется написать простенькую программу на чистом С (под UNIX), выполняющую запись в файл в обратном порядке (последняя набранная строка будет первой в файле). Использую динамически выделяемый массив для считывания файла и последующей записи этого массива в файл после записи набранного текста. К сожалению работает все некорректно (функция read() возвращает постоянно -1). Возможно я неправильно выделяю память, но я уже не знаю что делать, если кто-нибудь в курсе как это исправить, то подскажите. Представляю полный код

Код:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <fcntl.h>

int main(int argc, char **argv) {
	if(argc != 3) {
		printf("Invalid params number (%d insead of 3)\n", argc);
		exit(1);
	}

	struct stat metadata;
	size_t file_size;
	char *filename = argv[1];
	const int buff_size = atoi(argv[2]);
	char str[buff_size];
	char *buffer = NULL;
	ssize_t read_size, write_size;

	int file = open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0660);
	if (file < 0) {
		perror("error on open file");
		exit(1);
	}

	printf("For close type \"exit\"\n");

	while(1) {
		printf("enter line: ");
		fgets(str, sizeof(str), stdin);

		str[strlen(str) - 1] = '\0';
		
		if(!strcmp(str, "exit"))
			break;

		if(stat(filename, &metadata) < 0) {
			perror("error on stat");
			exit(1);
		}	
		file_size = metadata.st_size;
		printf("size of file: %d\n", file_size);
		
		if ((buffer = (char *)malloc(file_size*sizeof(char))) == NULL) {
			perror("error: can't allocate memory");
			exit(1);
		}
		
		printf("\nSIZEOF(BUFFER) = %d\n", sizeof(buffer));
		
		lseek(file, (off_t)0, SEEK_SET);

		read_size = read(file, buffer, (size_t)file_size);

		printf("\nSTRLEN(BUFFER) = %d\n\n", strlen(buffer));

		printf("read %d bytes\n", read_size);

		//lseek(file, (off_t)0, SEEK_SET);

		write_size = write(file, str, (size_t)strlen(str));
		write(file, buffer, (size_t)strlen(buffer));
		printf("%d bytes written\n", write_size);
		
		free(buffer);
	}

	close(file);
	return 0;
}
______________________
Используйте тег [CODE] (кнопка с решеткой # в форме сообщения) при вставке кода на форум.

Последний раз редактировалось Alex11223; 16.03.2017 в 00:05.
AndreyR32 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обратный порядок битов в двоичном коде. (Си) ivan1492 Помощь студентам 4 18.03.2013 21:44
Обратный порядок списка RevenGGe Паскаль, Turbo Pascal, PascalABC.NET 8 17.10.2012 11:20
Обратный порядок Vapali-Pik Помощь студентам 0 28.07.2011 00:39
Обратный порядок G. J. Cezar Общие вопросы C/C++ 2 22.10.2010 15:10
Обратный алфавитный порядок ~GVS Помощь студентам 0 21.04.2010 15:54