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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.10.2010, 18:33   #1
atenon
Форумчанин
 
Регистрация: 05.12.2009
Сообщений: 253
По умолчанию Удаление однобуквеных слов и пробелов

Здравствуйте!
Такая вот задача:
Цитата:
Дан текстовый файл F. Переписать текст в другой файл G, удалив все однобуквенные слова и лишние пробелы.
Предполагается, что текст написан грамматически правильно имеются только лишние пробелы.
Вот так я ее решил:
Код:
// 1-1-5.cpp: 

#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <iomanip>
#include <stdlib.h> 
using namespace std;
bool punctuation (char*); 
int main()
{
	setlocale(LC_ALL, "Russian");
	int i=0, j=0, n;
	char text[999999];
	char *word[1000];
	char s=' ', d='\0'; 
	FILE *F, *G;

	F=fopen("D:\\abc.txt", "rb");
	if (!F)
	{
		cout<<"File Not Found"<<"\n";
		return 1;
	}
	i=0;
	while(!feof(F))
	{
		fread((text+i), sizeof(char), 1, F);
		i++;
	}
	fclose(F);

	text[i-1]='\0';
	cout<<"ИСХОДНЫЙ ТЕКСТ"<<"\n"<<"\n";
	cout<<text<<"\n"<<"\n";

	// Разбивает текст на отдельные слова
	word [j]= strtok(text, " ");
	while (word[j-1]!=NULL)
	{
		j++;
		word[j]=strtok(NULL, " ");
	}
	n=j-1;

	G=fopen("D:\\abc1.txt", "wb");

	for (i=0; i<n; i++)
	{
		if (*(word[i]+1)!='\0')// Если слово не однобуквенное, записываем
		{
			j=0;

			while (*(word[i]+j)!='\0')
			{
				fwrite(word[i]+j, sizeof(char), 1, G);
				j++;
			}

			fwrite(&s, 1, 1, G);
		}
		else
		{
			if(punctuation(word[i]))
			{
				fseek (G, -1, SEEK_CUR);
				fwrite(word[i], sizeof(char), 1, G);
				fwrite(&s, 1, 1, G);
			}
			
		}
		
	}
	fclose(G);
		
return 0; 
} 

// Определяет является ли однобуквенное слово знаком пунктуации
bool punctuation (char*s) 
{
	char punct[]=".,!?;:";

	for (int i=0; i<7; i++)
	{
		if (*s==punct[i])
			return true;
	}	
	return false; 
}
Препод окинул мудрым взором код, почесал голову и выдал "Думай, можно сделать гораздо проще"
По моему проще некуда
Подскажите пожалуйста идею.
Спасибо за помощь.
Приходится бежать со всех ног, чтобы только остаться на том же месте! Если хочешь попасть в другое место, тогда нужно бежать по меньшей мере вдвое быстрее! Льюис Кэрол
atenon вне форума Ответить с цитированием
Старый 05.10.2010, 20:46   #2
ThisIzGame
Форумчанин
 
Регистрация: 31.08.2009
Сообщений: 161
По умолчанию

удалено....

Последний раз редактировалось ThisIzGame; 05.10.2010 в 20:59. Причина: не заметил флаг "rb"
ThisIzGame вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удаление начальных пробелов на С Corpinccom Общие вопросы C/C++ 8 23.07.2010 00:53
Удаление лишних пробелов. qwertytol Общие вопросы C/C++ 5 16.05.2010 15:43
си++ удаление начальных пробелов Bonne Помощь студентам 1 17.04.2010 18:05
Удаление пробелов на C++ REztor Помощь студентам 1 02.11.2009 20:36
Удаление пробелов Иван 883 Помощь студентам 1 20.04.2009 22:23