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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.12.2009, 18:53   #1
regAlex3
Новичок
Джуниор
 
Регистрация: 21.12.2009
Сообщений: 2
По умолчанию Форматирование текста (разбивка и выравнивание)

Здравствуйте. Нужно для Visual С++:

1) Получить данные из файла (слова без переносов).
2) Разбить на строки определённой длины задаваемой пользователем
3) Вывести на экран, при этом текст нужно выровнять по правому краю, прибавляя пробелы между словами.
Количество пробелов в разных группах, находящихся внутри одной строки не должны различаться более, чем на 1.

Написал часть программы, но она зависает (т.е. грузит цикл пропуска пробелов)
Код:
do {
	fscanf(f3, "%c", &t1);	//Читаем символ из файла
	} while (t1 != ' ' || t1 != '\n');

Код:
#include "stdafx.h"
#include "stdio.h"  // для printf(), scanf(), fprintf(), fscanf()
#include "stdlib.h"	// для exit(0);
#include "conio.h"
#include "string.h"

#define WIDTH 255   //max длина строки 255 символов
#define FNAME1 "baza.txt"   //файл - источник
#define FNAME2 "baza2(rezultat).txt"    //файл - приёмник


void main ()
{
int width; //требуемая ширина

char t1; //буфер символа
char buffer_slova[256];  //буфер слова
char bufer_stroki[256];
int Zanato=0; //Счетчик взятых символов для выравнивания
int kolih_slov; //Счетчик количества слов в строке

int i=0; //счетчик длины слова
int i2, i3; //переменные для организации обхода

int simv_str; //счетчик символа строки
int perenos=0;    //Флаг переноса (если 1 - переносить)

int konec_stroki;    //Позиция конечного символа bufer_stroki[]

int Ostatok;    //Остаток в расчетах
int Hislo_probelov; //Число пробелов между словами

int minWIDTH;   //min длина строки


FILE* f3;
if ((f3=fopen("baza.txt", "r"))==NULL)
	{
	printf("\nDidn't search file\n");	//Невозможно найти файл\n
	exit(0);
	}
while (!feof(f3)) //Пока не достигнем конца файла
	{
	//poisk_nahala();
	do {
	//printf("%d", nnnn);	//отладка
	fscanf(f3, "%c", &t1);	//Читаем символ из файла
	} while (t1 != ' ' || t1 != '\n');	//Если пробел или конец строки - пропускаем
	//конец poisk_nahala()


	do
	{
	buffer_slova[i]= t1;
	i=i++;	//счетчик длины слова
	fscanf(f3, "%c", &t1);
	}
	while ((t1 != ' ') || (t1 != '\n'));

	if (minWIDTH < i)
	minWIDTH = i;
} //конец while (!feof(f3)), проверяющий достигли мы конца файла
fclose(f3);
//конец Opr_minWIDTH()

//Корректируем ширину
if (minWIDTH > WIDTH)
	minWIDTH = WIDTH;


FILE* f1;

//Открываем текстовый файл, в режиме "только для чтения"
if ((f1=fopen(FNAME1, "r"))==NULL)
	{
	printf("\nDidn't search file\n");
	exit(0);
	}

//Poluh_shirinu();    //Получаем от пользователя ширину
scanf("%d", &width);
if(width > WIDTH)
	width = WIDTH;
	else if(width < minWIDTH)
		width = minWIDTH;
//конец Poluh_shirinu()

}

Последний раз редактировалось Sazary; 23.12.2009 в 17:47.
regAlex3 вне форума Ответить с цитированием
Старый 03.01.2010, 16:29   #2
regAlex3
Новичок
Джуниор
 
Регистрация: 21.12.2009
Сообщений: 2
По умолчанию

Вот попытался снова (только здесь данные вводятся вручную).
Не работает уже на стадии цикла обхода строки:
берёт длину первого слова до первого пробела и не находит отличных от пробела символов, а после выводит системную ошибку

Код:
#include "stdafx.h"
#include "stdio.h"

#define maximum 255

void main()
{
char str [255];
char str2 [255];

int i;
int i2=0;
int i3=0;
int i4=0;
int i5=0;
int dl;

int str_dl[129];
int max_dl=0;
int dlina;

int tek_dlina=0;
int kol_slov[129];
kol_slov[0]=0;

int Pysto1[129];
int Pysto2[129];

int i_k;
//int i_k2;

//Инициализируем массив строки
for (i=0; i<254; i++) str[i]=' ';

//1) Взятие строки у пользователя
printf("Vvedite stroky:\n");
scanf("%s", &str);

/*
2)
	а) Определение максимальной длины слова;
	б) Создание строки слов без лишних пробелов
	в) Создание массива длин слов
*/
for (i=0; i<255; i++)	//организуем обход строки
{
	dl=0;
	if (str[i]==' ') continue; //Пропускаем пробелы
	
	while (str [i] !=' ')		//Создаем строки  без ' ';
	{
		str2[i2]=str[i];
		dl++;	//счетчик длины слова
		i2++;
		i++;
	}
	str_dl[i3]=dl-1;	//Запоминаем длину слова
	
	if (str_dl[i3]>max_dl)
		max_dl=str_dl[i3];
		i3++;
}	//for (конец строки)
str_dl[i3]=0;	// 0 - как конец
/*
Результат:
max_dl максимальная длина слова в строке
str_dl[] - массив длин слов (конец =0)
str2 - строка без ' '
*/

//3) Введите ширину строки
printf("Vvedite shiriny ot %d do %d\n", max_dl, maximum);
scanf("%d", &dlina);

//Проверка введённой длины на вхождение в диапазон и исправляем если нет
if(dlina > maximum)
	dlina=maximum;
else if (dlina<max_dl)
	dlina=max_dl;
//Результат: dlina - необходимая длина строк

//4) Формируем строки
for (i3=0; str_dl[i3] !=0; i3++)	//Выполнять пока не кончились слова
{
	if (tek_dlina <= dlina)		//Если не больше требуемой длины: увеличивать счетчик слов и параметр "используемая длина"
	{
		kol_slov[i_k]++;
		tek_dlina=tek_dlina+str_dl[i3]+1;
	}
	else {			//Иначе вычесть лишний пробел из "используемой длины"; Подсчитываем необходимое число пробелов; начать заново счетчик слов
		tek_dlina--;
		Pysto1[i_k]=tek_dlina / kol_slov[i_k] - 1;
		Pysto2[i_k]=tek_dlina - Pysto1[i_k];
		i_k++;
		tek_dlina=str_dl[i3] + 1;
		kol_slov[i_k]=1;
	} //конец if
	i_k++;

}//конец for

/*
Результат:
kol_slov[] - число слов в строке
Pysto1 - число пробелов между словами
Pysto2 - остаток пробелов
i_k - количество строк
*/

//5)Создаём длинную строку текста в необходимом виде и разбитую на строки
for (int i_k2=0; i_k2 <= i_k; i_k2++)
{

	for (i=0; i <= kol_slov[i_k2]; i++)	//берем слова
	{
		for (i2=0; i2 <= str_dl[i2]; i2++)	//читаем и записываем слово
		{
			str[i4]=str2[i5];
			i4++;
			i5++;
		}
	
		//Добавляем пробелы
		for (i2=0; i2 <= Pysto1[i_k2]; i2++)
		{
			str[i4]=' ';
			i4++;
		}
		
		if(Pysto2[i_k2] != 0)
		{
			str[i4]=' ';
			i4++;
			Pysto2[i_k2]--;
		}
		//Конец добаления пробелов
	
	} //конец взятия слов для этой строки

	str[i4]='\n';
	i4++;
} //конец цикла строк

str[i4]='\0';

//Результат:
// str[] - строка уже выровненная и разбитая на строки

//Выводим результат
printf("\n%s",str);


}// main()
regAlex3 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выравнивание текста по вертикали bowa HTML и CSS 8 20.09.2009 20:34
Выравнивание искаженного текста RealKultura Общие вопросы C/C++ 0 19.12.2008 23:25
Разбивка текста Vinslova Microsoft Office Excel 3 30.10.2008 12:49
Выравнивание текста SeregaIRK Общие вопросы Delphi 4 21.07.2008 15:17
выравнивание текста по ширине Алёна Общие вопросы Delphi 6 18.04.2007 11:31