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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.02.2012, 18:27   #1
goo
 
Регистрация: 20.02.2011
Сообщений: 7
По умолчанию [С++] Вывести на экран из файла строки, где есть двухзначные цифры

Нужно вывести на экран из файла только те строки, где есть двухзначные цифры (в строке могут быть одновременно двухзначные и трехзначные числа).

Программу я написал такую:

Код:
#include "stdafx.h"
#include "iostream"
#include "fstream"
//#include "stdio.h"
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
	// создание входного потока и открытие файла
	ifstream fin("c:\\projects\\text1.txt", ios::in);
	if (!fin)
	{
		cout << "Can't open input file" << endl;
		system("pause");
		return -1;
	} 

	// создание выходного потока и открытие файла
	ofstream fout("c:\\projects\\text2.txt", ios::out);
	if(!fout)
	{
		cout << "Can't create output file" << endl;
		system("pause");
		return -1;
	}

	char buf[255];
	char lim;
	int i = 0;
	int good_str = 0;
	while (!fin.eof())		// пока не конец файла
	{
		good_str = 0;
		i = 0;
		cout<<endl;
		fin.getline(buf, 255, lim = '\n');	// считать одну строку
		while (buf[i])  // рассмотреть каждый символ этой строки 
		{ 
			if (isdigit(buf[i]))		// если текущее число - цифра
				//if (isdigit(buf[i+1]) && (i+1) <= 255)	// если последующий символ тоже цифра
				if (isdigit(buf[i+1]))
					//if (!isdigit(buf[i+2]) && (i+2) <= 255)
					if (!isdigit(buf[i+2]))
					{
						good_str = 1;
						break;
					}
					else 
					{
						good_str = 0;
					}
			i++;
		} 
		if (good_str)
		{
		   cout << buf << endl;
		   //fout << buf << endl;
		}
	}
	fin.close();
	fout.close();
	cout << endl;
	system("pause");
	return 0;
}
Но она сейчас выводит строки с двухзначными числами, а также строки где есть только трехзначные числа и большего разряда. Не подскажете. как исправить?
goo вне форума Ответить с цитированием
Старый 04.02.2012, 19:39   #2
_kilik_
Пользователь
 
Аватар для _kilik_
 
Регистрация: 16.08.2011
Сообщений: 69
По умолчанию

По идее можно сделать так.
Функция проверки строки символов на наличия двухзначных чисел.
Код:
bool testStr(char *str){
	int j;
	for(int i=0;str[i]!='\0';){//от первого до посл символа
		for(;!isdigit(str[i])&&str[i]!='\0';i++);//проходим пока не число или не конец строки
		for(j=0;isdigit(str[i]);j++,i++);//j-количество чисел подряд
		if(j==2)
			return true;
	}
	return false;
}
Не проверял, если не будет работать, сообщите.

Последний раз редактировалось _kilik_; 04.02.2012 в 20:00.
_kilik_ вне форума Ответить с цитированием
Старый 04.02.2012, 19:54   #3
goo
 
Регистрация: 20.02.2011
Сообщений: 7
По умолчанию

Цитата:
Сообщение от _kilik_ Посмотреть сообщение

Не проверял, если не будет работать, сообщите.
Сейчас проверю.
Эта функция на абсолютно все строки файла возвращает 1.

Последний раз редактировалось goo; 04.02.2012 в 20:00.
goo вне форума Ответить с цитированием
Старый 04.02.2012, 20:16   #4
_kilik_
Пользователь
 
Аватар для _kilik_
 
Регистрация: 16.08.2011
Сообщений: 69
По умолчанию

Проверил все вроде корректно:
Код:
#include "iostream"
#include "fstream"
using namespace std;

bool testStr(char *str);

int main()
{
	// создание входного потока и открытие файла
	ifstream fin("D:\\t.txt", ios::in);
	if (!fin)
	{
		cout << "1 Can't open input file" << endl;
		system("pause");
		return -1;
	} 

	// создание выходного потока и открытие файла
	ofstream fout("D:\\1.txt", ios::out);
	if(!fout)
	{
		cout << "2 Can't create output file" << endl;
		system("pause");
		return -1;
	}

	char buf[255];
	char lim;
	while (!fin.eof())// пока не конец файла
	{
		cout<<endl;
		fin.getline(buf, 255, lim = '\n');	// считать одну строку
		if (testStr(buf))
		   cout << buf << endl;
	}

	fin.close();
	fout.close();
	cout << endl;
	system("pause");
}

bool testStr(char *str){
	int j;
	for(int i=0;str[i]!='\0';){//от первого до посл символа
		for(;!isdigit(str[i])&&str[i]!='\0';i++);//прогходим пока не число или не конец строки
		for(j=0;isdigit(str[i]);j++,i++);//j-количество чисел подряд
				if(j==2)
					return true;
	}
	return false;
}
пример текстового файла
Код:
fyhfkg45hjgfjh
kgyuukyg454455gkg kgukyf jhfguk
yfj iutuy45 jgukgf
hgjyuf4546 hjfyhufvgi67nkl
hiulygfffku 77
1
256 lohi
hkjhkh76765
78
результат:

Последний раз редактировалось _kilik_; 04.02.2012 в 20:22.
_kilik_ вне форума Ответить с цитированием
Старый 04.02.2012, 20:22   #5
goo
 
Регистрация: 20.02.2011
Сообщений: 7
По умолчанию

Спасибо Вам большое. Все работает.
Не работало из-за того, что я переделал bool на int, а вместо false поставил -1. Видимо, СИ понимает -1 также, как и 1. Поставил 0 и все нормально. Спасибо!
goo вне форума Ответить с цитированием
Старый 04.02.2012, 23:34   #6
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,119
По умолчанию

goo

Нужно вывести на экран из файла только те строки, где есть двухзначные цифры (в строке могут быть одновременно двухзначные и трехзначные числа).

Программу я написал такую:


Эти программу сотри, и используй C++

Код:
#include <iostream>
#include <locale>

#include <fstream>
#include <iterator>

#include <algorithm>
#include <functional>

struct three_digits : public std::unary_function<int, bool>
{
	bool operator()(int n) const
	{
		return n >= 100 && n <= 999;
	}
};

void print_three_number_digits(std::istream& is)
{
	typedef std::istream_iterator<int> I;
	typedef std::ostream_iterator<int> O;

	std::remove_copy_if(I(is), I(), O(std::cout, " "), std::not1(three_digits()));
	std::cout << std::endl;
}

int main()
{
	setlocale(LC_ALL, "");

	std::ifstream ifs("numbers.txt");
	print_three_number_digits(ifs);

	return 0;
}
Rififi вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вывести на экран текст с файла, нужен совет vitik Общие вопросы C/C++ 4 22.04.2011 13:43
Не могу вывести на экран все отредактированные строки! iron-YYY Общие вопросы C/C++ 1 29.05.2009 11:12
Как вывести содержимое файла на экран в паскале? Fatality Помощь студентам 8 23.04.2009 13:48
считать из файла две строки, вывести на экран символы первой строки, которые отсутствуют во второй gotex Помощь студентам 4 08.05.2008 02:27
Как вывести из текстового файла на экран русский текст? Mischa Помощь студентам 8 12.03.2008 06:23