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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.06.2009, 00:02   #1
OXED
 
Регистрация: 22.06.2009
Сообщений: 6
По умолчанию С++. Работа с файлом и несколькими строками

Данная программа должна открывать текстовый файл "asdw.txt",в котором записаны несколько строк,считывать их в из файла в программу и искать количество слов состоящих из не более 4х букв. Само условие работает нормально. Проблема заключается в том что программа после того как считает из файла 1ю строку, не переходит на 2ю. Подскажите пожалуйста как можно исправить. вот мой код :

Код:
#include <iostream.h>
#include <conio.h>
#include <string.h>
#include <stdio.h>

FILE *f;
int stroka(int n, char *s){
cout<<"Пропишите полный путь к файлу : "<<endl;
char p[50];   //путь к файлу (например : "D:\asdw.txt")
cin>>p;
f=fopen(p,"r");

while(!feof(f)){
fgets(s,50,f); }
n=strlen(s);
int k=0;
for(int i=0; i<n; i++){
	int kb=0;
	while((*(s+i)!=' ')&&(*(s+i)!=NULL)&&(i<n)){
		kb++;
		i++;		   }
if ((kb<5)&&(kb!=0))
	k++;
	i++;        }
return(k);
}

void main(){
clrscr();
char *s=new char[250];
int n;
cout<<"Количество слов состоящих из не более 4 букв: "<<stroka(n,s);
getch();
}

Последний раз редактировалось Stilet; 01.07.2009 в 08:17.
OXED вне форума Ответить с цитированием
Старый 24.06.2009, 00:47   #2
Ja`
Пользователь
 
Аватар для Ja`
 
Регистрация: 12.02.2009
Сообщений: 11
По умолчанию

fgets(s,50,f); - второй аргумент функции (размер буфера), в данном случае "50" означает, что будет считано 49 символов строки, последний же 50-ый символ будет нулевым \0.
fgets читает символы из потока в строку. Чтение заканчивается, когда встречается литера `\n' (новая строка). В данном случае можно сделать один вывод, строка записанная в файле содержит большее количество символов чем 49, соответственно строка считывается не до конца и на следующем этапе происходит чтение той же строки начиная с позиции каретки 50. Решение - увеличить буфер(:
У Вас сам буфер (строка) - char *s=new char[250] занимает 250 байт, а считать пытаетесь только 50? Правильнее будет тогда fgets(s,sizeof(s),f);
Ja` вне форума Ответить с цитированием
Старый 25.06.2009, 00:32   #3
OXED
 
Регистрация: 22.06.2009
Сообщений: 6
По умолчанию

если написать fgets(s,sizeof(s),f); то считвает только 1 слово
попробовал написать fgets(s,250,f); - тоже не помогло,по прожнему только первая строка считывается
OXED вне форума Ответить с цитированием
Старый 25.06.2009, 01:00   #4
ISergeyN
Maniac
Форумчанин
 
Аватар для ISergeyN
 
Регистрация: 03.01.2009
Сообщений: 450
По умолчанию

getline(..);

твоя задача на С++
Код:
#include <iostream>
#include <fstream>
#include <algorithm>
#include <string>
#include <vector>
#include <sstream>

bool pred(const std::string &rhs){
	return rhs.size() < 4;
}

int count_string(const std::string &filen){
	std::ifstream file(filen.c_str());
	std::string lines;
	if(!file.is_open())
		return -1;

	while(! file.eof()){
		std::string currline;
		getline(file, currline);
		lines += currline;
	}
	file.close();

	std::stringstream ss(lines);
	std::vector<std::string> v;
	std::copy(std::istream_iterator<std::string>(ss),std::istream_iterator<std::string>(), std::back_inserter(v));

	//std::copy(v.begin(), v.end(),std::ostream_iterator<std::string>(std::cout,"\n"));

	return std::count_if(v.begin(), v.end(), pred);

}
int main () {

	std::cout << count_string("file.txt") << '\n';
	return 0;
}
ЗЫ. после каждого слова должен быть пробел.
Стандартные библиотеки разработаны с учетом многолетнего опыта лучших программистов и они не больны "детскими болезнями крутизны в программизме"....
ISergeyN вне форума Ответить с цитированием
Старый 01.07.2009, 02:09   #5
OXED
 
Регистрация: 22.06.2009
Сообщений: 6
По умолчанию

благодарю.
OXED вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Си++. работа с файлом milate Помощь студентам 0 08.06.2009 12:52
Работа с несколькими документами одновременно Busine2009 Microsoft Office Word 12 04.06.2009 19:53
Одновременная работа с несколькими портами через ServerSocket Sane2k Работа с сетью в Delphi 16 06.03.2009 17:24
Работа с файлом в C Mishka Помощь студентам 2 22.07.2008 13:28
Работа с текстовым файлом nataly_ukr БД в Delphi 23 07.12.2007 22:13