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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.12.2009, 08:34   #1
PastoriXx
Пользователь
 
Регистрация: 20.12.2009
Сообщений: 40
По умолчанию Чтение файла

Задание такое: дан текстовый файл, найти самое длинное слово, если их несколько, то найти их все, вывести их на экран.
Проблема: Текст ведь может быть очень большим, а массив не резиновый((
Как сделать возможность чтения больших текстов?
Код:
#define _CRT_SECURE_NO_DEPRECATE

#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <locale.h>


int main()
{
	setlocale(LC_ALL, "Russian");	
	char s[8000]="";
	printf("--------------------------------------------------------------------------------");
	printf("Дан текстовый файл F. Найти самое длинное слово. Если таких слов несколько, \nто найти их все. Переписать эти слова в другой файл G.\n");
	
	//Открытие файлов
	FILE *F;
	if((F=fopen("F.txt", "rt")) == NULL)
		{
			printf("Не могу открыть F.txt на чтение.\n");
			return -1;
	   
		}
	
	FILE *G;
	G = fopen( "G.txt", "wt+" );
	if((G = fopen( "G.txt", "wt+" )) == NULL) 
		{
			printf("Не могу открыть G.txt на запись.\n");
			return -2;
		}
	
	char simvol, malloc(8000);

	for(int i=0; (simvol=getc(F))!=EOF; i++)
	s[i]=simvol;
	fclose(F);
	printf("Исходный текст:\n\n%s\n\n", s);
	printf("--------------------------------------------------------------------------------");

	//Поиск слов с максимальной длиной символов
	int maxStart , maxLen=0, len=0;
	for(int i=0; i<strlen(s); i++)
	// i номер позиции в строке
	// len текущий показатель длины слова
	// maxLen длина самого длинного слова
	// maxStart номер позиции с которой начинается самое длинное слово
	{
	   if(s[i]!=' ' && s[i]!='\n' && i<strlen(s)-1)
		{
			len++;
		}
	   else
		{
			if(i==strlen(s)-1){len++;i++;}
			if(len>maxLen){maxLen=len; maxStart = i-maxLen;}
			len=0;
		}
	}
	//зная длину самого длинного слова, заного читаем текст из массива s[] 
	
	printf("\nСлово(а) максимальной длины в файле F.txt:\n\n");
	for(int i=0; i<strlen(s); i++)
	{
		if(s[i]!=' ' && s[i]!='\n' && i<strlen(s)-1)
		 {
			len++;
		 }
		else
		 {
			if(i==strlen(s)-1){len++;i++;}
			if(len==maxLen)
			 { 
				
				 for(int j=i-maxLen; j<=i; j++)
				 {
					
					printf("%c", s[j]); 
					fputc( s[j], G ); // записываем символ
				 }
					printf("\n\n");
			 }
				
			len=0;
		 }
	}

	printf("\nДлина самого длинного слова равна %d символов.\n", maxLen);
	
	
	_fcloseall();
	printf( "\nДанные записаны в файл G.txt\n" );
	printf("--------------------------------------------------------------------------------");
	getch();
	 
}
PastoriXx вне форума Ответить с цитированием
Старый 29.12.2009, 12:15   #2
GonZaleZ
Пользователь
 
Регистрация: 19.06.2009
Сообщений: 57
По умолчанию

попробуй читать из файла по одному слову и сравнивать его длину с предыдущим большим словом. если больше, запоминать и сравнивать потом с ним. как дойдёшь до нулевого символа, выводи это слово
GonZaleZ вне форума Ответить с цитированием
Старый 29.12.2009, 13:26   #3
ROD
Linux C++ Qt ARM
Старожил
 
Аватар для ROD
 
Регистрация: 30.11.2008
Сообщений: 3,030
По умолчанию

Заведи "буфер" для хранения самого длинного слова/слов.
А текст открывай не весь, а по чуть-чуть. (ну, скажем, по одной строке или по n байт.)
Дилетант широкого профиля.

"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс
ROD вне форума Ответить с цитированием
Старый 29.01.2010, 18:32   #4
Alone_Ghost
Новичок
Джуниор
 
Аватар для Alone_Ghost
 
Регистрация: 28.01.2010
Сообщений: 1
По умолчанию

Начинаю изучать С++ и не могу понять как для чтения файла указать путь на другую папку, директорию и т.п....
Alone_Ghost вне форума Ответить с цитированием
Старый 29.01.2010, 20:48   #5
Assemblerru
Форумчанин
 
Регистрация: 28.01.2010
Сообщений: 224
По умолчанию

да чёта савсем гемар какойто
попробуй проще зарядить свой файл как листинг

Код:
//это глобальные переменные но и такой код я писал под С++Builder
//расположение файла если файл расположен С/1 то 
// S = "С//1";
AnsiString S = "";
AnsiString StrokaNachalaData ="";//просто строка начальных данных
AnsiString StrDataBig = "";//полученная строка
//указатель для згрузки файла
TStringList *List = new TStringList;
int  I ;//для подсчета строк
int Y;//подсчет символов в строке
//====код с проверкой правильности загрузки файла
 try
 {
    List -> LoadFromFile (S);//загрузили файл
  I = ListFlach -> Count;//через свойство посчитали строки
//для коррекции данных т.к. строки считаются от 0
  I =  I --;
for (int i = 0; i <= I; i++)
	{
         //загрузили первоначальную строку
         StrokaNachalaData = List ->Strings[i];
//я не помню как посчитать кол=во символов в строке но смысл таков
//1 подсчет символов в строке
Y = .........;
//2 организуеш внутренний цикл
for (int x = 0; x <= Y; x++)
   {
 //я так с ходу не соображу но в принципе так...символ проверяеш с 
//  пробелом
 if (символ(x) == " ")
    { 
     //кароче склипасовский подумаю и откину ответ на сюда этот вопрос
    }
   }
  }
 }
catch(...)//обработка возникших ошибок
  {
   ShowMessage ("Выбирите файл прошивки");
  }
не сгрызи гранит нуки зубы ысче понадобятся (ну всмысле шутка....)
всему свое время как зиме и весне
и каждому солнцу свой неба кусок

Последний раз редактировалось MaTBeu; 29.01.2010 в 21:37.
Assemblerru вне форума Ответить с цитированием
Старый 30.01.2010, 14:26   #6
Olejik
Форумчанин
 
Регистрация: 02.06.2009
Сообщений: 218
По умолчанию

Цитата:
Сообщение от PastoriXx Посмотреть сообщение
Проблема: Текст ведь может быть очень большим, а массив не резиновый((
здесь где то уже приводился пример сколько будет занимать памяти массив на n символов, можно зделать например массив на 10000, читаете из файла посмтрочно и все, я так всегда делал, не видел еще строки, в которой было более или приблизительно 10000 символов )
у меня была лабораторная работа такая, только там использовались указатель массивов на массивы или как то так, я читал строку из массива, с помощью функций узнавал конец и начало слова, в другой массив я записывал порядковый номер символа, который является началом этого слова, там дальше идет волшебство и выдает весь результат. Только я считывал весь файл сразу в массив, хотя так и надо )))
кароче, берете, открываете файл, ставите каретку (или как то так) в конец файла, потом узнаете какой номер порядковый у последнего символа, создаете динамический массив такой размерности, считываете все в него и вуаля! )
Если не знаете такой функции, то поищите в интернете как: "как узнать сколько символов в файле", ну или примерно так.
fseek Вам в помощь, в MSDN найдите эту функцию и пример посмотрите и все поймете )

Последний раз редактировалось Olejik; 30.01.2010 в 14:46.
Olejik вне форума Ответить с цитированием
Старый 30.01.2010, 19:19   #7
Assemblerru
Форумчанин
 
Регистрация: 28.01.2010
Сообщений: 224
По умолчанию

корче держи код правда не проверял но должен работать покрайней мере в С++Builder

//расположение файла прошивки Flash
AnsiString SFail = "";

//указатель для згрузки файла прошивки Flash
TStringList *List = new TStringList;

//строка для загрузки данных из файла
AnsiString StrokaNachalaData = "";

//вспомогательная строка

AnsiString Str = "";

//переменная для подсчета строк
int I;

//переменная подсчета символов в строке
int J;

//переменные для загрузки самого длинного слова
int X, Y, N, H;//типа координаты про = 0, 0 - это левый верхний край

try
{
List -> LoadFromFile (SFail);//загрузили файл
I = ListFlach -> Count;//через свойство посчитали строки
//для коррекции данных т.к. строки считаются от 0
I = I --;
//проводим запись Flach
for (int i = 0; i <= I; i++)
{
//загрузили первоначальную (очередную) строку
StrokaNachalaData = ListFlach ->Strings[i];
//посчитаем символы в строке
J = StrokaNachalaData.Length();
//у нас есть строка с кол=вом в ней символов
//и поэтому выбираем символы (слова) разделенные пробелом
for (int y = 0, y <= J, y++)
{
Str = StrokaNachalaData;
if (Str[y] == " ")//проверка установки пробела
{
if (N < X)
{
N = X;
H = Y;
X = 0;
}
}
Else
{
X=X++;//увеличение координаты
}
Y = Y++;
}
}
}

catch(...)//обработка возникших ошибок
{
ShowMessage ("Выбирите файл прошивки");
}
всему свое время как зиме и весне
и каждому солнцу свой неба кусок
Assemblerru вне форума Ответить с цитированием
Старый 23.02.2012, 08:03   #8
Артем 1980
 
Аватар для Артем 1980
 
Регистрация: 23.02.2012
Сообщений: 3
По умолчанию

Извините что не в тему... Доброго времени суток! Подскажите пожалуйста как тут создать новую тему, или задать вопрос не относящейся ни к одному разделу, заранее спасибо?!
Артем 1980 вне форума Ответить с цитированием
Старый 23.02.2012, 08:13   #9
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
Сообщение от Артем 1980 Посмотреть сообщение
Извините что не в тему... Доброго времени суток! Подскажите пожалуйста как тут создать новую тему, или задать вопрос не относящейся ни к одному разделу, заранее спасибо?!
Есть два раздела:
1 - свободное общение.
2 - для спамеров.
В них можно совать вопросы "не в тему".
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[C++] чтение из файла proga. Помощь студентам 1 25.09.2009 23:28
Чтение из файла pautina Общие вопросы Delphi 8 23.01.2009 15:48
чтение из файла. aschak Общие вопросы C/C++ 9 30.12.2008 15:24
Чтение из файла e@gle Общие вопросы Delphi 3 14.12.2008 17:21
чтение из файла Илья500 Общие вопросы C/C++ 26 05.12.2008 00:37