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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.10.2015, 15:17   #1
vova_makr
Пользователь
 
Регистрация: 25.09.2015
Сообщений: 42
По умолчанию Есть файл с текстом. Нужно записать ззадом на перед текст с файла.

Есть файл с текстом. Нужно записать ззадом на перед текст с файла. Пример: Я люблю Москву ... Москву люблю Я.
Использовать односвязный список для хранения статистик. Я что то написал, но работать оно не хочет

Код:
void Ex2()
{
	const char* fileName = "D:\\file1.txt";
	FILE* fileInput = fopen(fileName, "r");
	if (fileInput == nullptr)
		return;

	struct Node
	{
		char* value;
		Node* nextNode;
	};
	Node* head = nullptr;

	char word[20];
	while (true)
	{
		if (fscanf(fileInput, "%s", word) == EOF)
		{
			break;
		}
		else
		{
			Node* current = head;
			for (; current != nullptr; current = current->nextNode)
			{
				if (strcmp(current->value, word) == 0)
				{
					++current->value;
					break;
				}
			}
			if (current == nullptr)
			{
				Node* node = (Node*)malloc(sizeof(Node));

				node->value = (char*)malloc((strlen(word) + 1) * sizeof(char));
				strcpy(node->value, word);

				node->nextNode = nullptr;

				if (head == nullptr)
				head->nextNode = node;
				head = node;
			}
			printf("%s %u\n", current->value);
		}
		
	}


		for (Node* current = head; current != nullptr;)
		{
			free(current->value);

			Node* temp = current;
			current = current->nextNode;
			free(temp);
		}
		fclose(fileInput);
	}

Последний раз редактировалось vova_makr; 17.10.2015 в 15:25.
vova_makr вне форума Ответить с цитированием
Старый 17.10.2015, 17:00   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Использовать односвязный список для хранения статистик
Обязательно список?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 17.10.2015, 17:59   #3
vova_makr
Пользователь
 
Регистрация: 25.09.2015
Сообщений: 42
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Обязательно список?
да. по азданию так нужно((
vova_makr вне форума Ответить с цитированием
Старый 17.10.2015, 18:57   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
по азданию
Какое жесткое аздание. Непереаздать однако
Код:
void Ex2()
{
	const char* fileName = "D:\\file1.txt";
	FILE* fileInput = fopen(fileName, "r");
	if (fileInput == nullptr)
		return;

	struct Node
	{
		char value[20];
		Node* nextNode;
	};
	Node* head = nullptr, *i=0;

	char word[20];
	for(fscanf(fileInput, "%s ", word);!feof(fileInput);fscanf(fileInput, "%s ", word)){
           i=(Node*)malloc(sizeof(Node));
           strcpy(i->value,&word);
           if(head) {
               i->nextNode=head;
           }
           head=i;
        }
	


		for (Node* current = head; current != nullptr;current = current -> nextNode)
		{
			printf("%s ",current -> value);
		}
	}
Смотри, только на переаздачу не попади
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 17.10.2015, 19:57   #5
vova_makr
Пользователь
 
Регистрация: 25.09.2015
Сообщений: 42
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Какое жесткое аздание. Непереаздать однако
Код:
void Ex2()
{
	const char* fileName = "D:\\file1.txt";
	FILE* fileInput = fopen(fileName, "r");
	if (fileInput == nullptr)
		return;

	struct Node
	{
		char value[20];
		Node* nextNode;
	};
	Node* head = nullptr, *i=0;

	char word[20];
	for(fscanf(fileInput, "%s ", word);!feof(fileInput);fscanf(fileInput, "%s ", word)){
           i=(Node*)malloc(sizeof(Node));
           strcpy(i->value,&word);
           if(head) {
               i->nextNode=head;
           }
           head=i;
        }
	


		for (Node* current = head; current != nullptr;current = current -> nextNode)
		{
			printf("%s ",current -> value);
		}
	}
Смотри, только на переаздачу не попади
Как то так? Я свое передела, хочу понять а не тупо скопировать ваше
Код:
void Ex()
{
	const char* fileName = "D:\\file.txt";
	FILE* fileInput = fopen(fileName, "r");
	if (fileInput == nullptr)
		return;

	struct Node
	{
		char* value;
		Node* nextNode;
	};
	Node* head = nullptr;

	char word[20];
	while (true)
	{
		if (fscanf(fileInput, "%s", word) == EOF)
		{
			break;
		}
		else
		{
			Node* node = (Node*)malloc(sizeof(Node));
			strcpy(node->value, word);

			if (head == nullptr)
				node->nextNode = head;
			head = node;
			
		}
	}


	for (Node* current = head; current != nullptr; current = current->nextNode)
		{
			free(current->value);

			Node* temp = current;
			printf("%s\n", current->value);
			free(temp);
		}
		fclose(fileInput);
	}

Последний раз редактировалось vova_makr; 17.10.2015 в 20:07.
vova_makr вне форума Ответить с цитированием
Старый 17.10.2015, 20:41   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
хочу понять а не тупо скопировать
Это похвально конечно но:
Цитата:
fscanf(fileInput, "%s", word) == EOF
fscanf возвращает число правильно считанных переменных, а не состояние конца файла. На EOF его проверять глупо.
Цитата:
free(current->value);
У тебя после этого освобождения прописан вывод на экран. Подумай - что должно выводиться, коль-скоро выводимое освобождено?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 17.10.2015, 21:10   #7
vova_makr
Пользователь
 
Регистрация: 25.09.2015
Сообщений: 42
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Это похвально конечно но:

fscanf возвращает число правильно считанных переменных, а не состояние конца файла. На EOF его проверять глупо.

У тебя после этого освобождения прописан вывод на экран. Подумай - что должно выводиться, коль-скоро выводимое освобождено?
передела, но не правильно работает
Код:
for (Node* current = head; current != nullptr; current = current->nextNode)
		{
			printf("%s\n", current->value);
			free(current->value);

			Node* temp = current;
			free(temp);
		}
		fclose(fileInput);
!feof(fileInput) - у Вас ж тоже проверяет на конец файла

Последний раз редактировалось vova_makr; 17.10.2015 в 21:12.
vova_makr вне форума Ответить с цитированием
Старый 17.10.2015, 21:26   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
но не правильно работает
Что это?:
Цитата:
Node* temp = current;
free(temp);
Посмотри внимательнее: Ты дважды пытаешься освободить указатель. Убери.
Цитата:
у Вас ж тоже проверяет на конец файла
Безусловно. Именно так и стоит проверять.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задание по Visual c++ 2013, Нужно создать файл, записать в него информацию, а затем по другой кнопке считать информацию из файла. Rastoried Visual C++ 5 16.03.2014 20:21
Имеется типизированный файл с тридцатью числами. Записать в другой файл числа имеющегося файла в обратном порядке. Валентин77 Общие вопросы C/C++ 8 17.12.2013 22:53
файл f целого типа, число компонент файла делится на 10. Записать в файл g наибольшие значения каждых десяти компонент файла kulak_sacharik Паскаль, Turbo Pascal, PascalABC.NET 5 25.11.2012 16:17
записать текст в файл satka Microsoft Office Access 1 01.11.2011 18:30