Вопрос по С++

xxxFAFNIRxxx

Вечный студент :)
Язык : Си
Задача. Имеется текстовый файл. Необходимо вывести статистику этого файла: сколько в файле слов, предложений, строк.

Вот написал такое:
Код:
#include <stdio>
#include <stdlib>
FILE *f;
int s,q,w;
char c;
void main (){
s=q=w=0;
f=fopen("K:\\1.txt","r");
if((f=fopen("K:\\1.ttx","r"))==0){
	printf("Nevozmojno otkrit fail");
}
while(!feof(f)){
fscanf(f,"%c",&c);
   if(c==' '){
   	s++;
   }
   if (c=='.'){
   	q++;
   }
   if(c=='\n'){
   	w++;
   }
}
fclose(f);
printf("Slov v faile =%d\n",s);
printf("Predlojenii v faile =%d\n",q);
printf("Strok v faile =%d\n",w);
}
Проблема в том, что выводит неправльное кол-во, я то понимаю в чём проблема, но не могу придумать как решить. Посоветуйте плз как исправить, или другой вариант решения.
 

dreamer

Member
Язык : Си
Задача. Имеется текстовый файл. Необходимо вывести статистику этого файла: сколько в файле слов, предложений, строк.

Вот написал такое:
Код:
#include <stdio>
#include <stdlib>
FILE *f;
int s,q,w;
char c;
void main (){
s=q=w=0;
f=fopen("K:\\1.txt","r");
if((f=fopen("K:\\1.ttx","r"))==0){
	printf("Nevozmojno otkrit fail");
}
while(!feof(f)){
fscanf(f,"%c",&c);
   if(c==' '){
   	s++;
   }
   if (c=='.'){
   	q++;
   }
   if(c=='\n'){
   	w++;
   }
}
fclose(f);
printf("Slov v faile =%d\n",s);
printf("Predlojenii v faile =%d\n",q);
printf("Strok v faile =%d\n",w);
}
Проблема в том, что выводит неправльное кол-во, я то понимаю в чём проблема, но не могу придумать как решить. Посоветуйте плз как исправить, или другой вариант решения.
Во-первых, это жесть: (даже несмотря на ошибку в расширении файла)
Код:
f=fopen("K:\\1.txt","r");
if((f=fopen("K:\\1.ttx","r"))==0){
Во-вторых, есть два замечания:
Код:
int getGroup(char c)
{
    if (c == ' ' || c == ',' || c == '-' ...) return WORD_DELIMITERS;
    if (c == '\n' || c == '\r') return LINE_DELIMITERS;
    if (c == '.' || c == '!' || c == '?') return SENTENCE_DELIMITERS;
    return ANYTHING_ELSE;
}

int last = getGroup(fgetc(f));
while (! feof(f)) {
    int curr = getGroup(fgetc(f));
    if (last == curr) continue; // чтоб пропустить серии пробелов и т.д.
    ...
    if (curr == WORD_DELIMITERS) words++;
    ...
    last = curr;
}
 

quant

yeah
Код:
FILE* f = fopen("K:\\1.txt","r");
if(f == NULL) {
    puts("the end");
    return ; // тыж не выходиш при ошибке
}
...
а читать символ можно проще
Код:
c = fgetc(f);
а так всё чётко, кроме случая где файл не найден
 

Cris

Member
такс вопрос с сокетами -
ну как говорилось раньше есть клиент-сервер, сервер биндит порт и слушает,
а вот с конектом клиента возникают траблы, как направить клиент так чтобы исходяший данные били не из какого попало порта а из указаного - т.е я случайно чтоб посмотреть написал на сервере строчку корорая показивает с какого порта и ИП идут соединения, как оказалось клиент конектиться полностью с различных портов, как поменять его на тот что нужен мне, тоесть я хочю чтобы данные исходили только из 12345 порта и приходили только на 54321 порт, с 54321 все норм но вот с 12345 хз?
 
A

AkeL.php

Guest
А разве при создании сокета ты не указываешь ip/домен и порт?
Не занимался данным вопросом в с++, но на java это дело выглядит так

Код:
public static String server = "127.0.0.1";
public static int port = 9876;
......
socket = new Socket(server, port);
 

Cris

Member
А разве при создании сокета ты не указываешь ip/домен и порт?
Не занимался данным вопросом в с++, но на java это дело выглядит так

Код:
public static String server = "127.0.0.1";
public static int port = 9876;
......
socket = new Socket(server, port);
ну этоже java, в С++ болие мудрено(
 

Cris

Member
ну вот я нашол вроде то что я хочю но падло неработает((

Код:
1  #include <sys/types.h>  
2  #include <sys/socket.h>  
3  #include <netinet/in.h>  
4  #include <netdb.h>  
5  #include <memory.h>   
6  #define SRV_HOST "delta"  
7  #define SRV_PORT 1234  
8  #define CLNT_PORT 1235  
9  #define BUF_SIZE 64 
10  #define TXT_ANSW "I am your client\n"  
11  main () { 
12    int s; 
13    int from_len; 
14    char buf[BUF_SIZE]; 
15    struct hostent *hp; 
16    struct sockaddr_in clnt_sin, srv_sin;  
17    s = socket (AF_INET, SOCK_STREAM, 0); 
18    memset ((char *)&clnt_sin, '\0', 
                       sizeof(clnt_sin)); 
19    clnt_sin.sin_family = AF_INET; 
20    clnt_sin.sin_addr.s_addr = INADDR_ANY; 
21    clnt_sin.sin_port = CLNT_PORT; 
22    bind (s, (struct sockaddr *)&clnt_sin, 
                   sizeof(clnt_sin));  
23    memset ((char *)&srv_sin, '\0', 
                sizeof(srv_sin)); 
24    hp = gethostbyname (SRV_HOST); 
25    srv_sin.sin_family = AF_INET; 
26    memcpy ((char 
*)&srv_sin.sin_addr,hp->h_addr,hp->h_length); 
27    srv_sin.sin_port = SRV_PORT; 
28    connect (s, &srv_sin, sizeof(srv_sin)); 
29    from_len = recv (s, buf, BUF_SIZE, 0); 
30    write (1, buf, from_len); 
31    send (s, TXT_ANSW, sizeof(TXT_ANSW), 0); 
32    close (s); 
33    exit (0);
34    }
ну вообщем мне нужнона клиенте забиндить порт - bind,
но когда я его юзаю потом почемуто клиент неможет приконектиться к серверу(
 
Останнє редагування:

dreamer

Member
ну вообщем мне нужнона клиенте забиндить порт - bind,
но когда я его юзаю потом почемуто клиент неможет приконектиться к серверу(
А можно узнать – нафига козе баян? Порты нужны, чтоб привязать сокет к уникальному имени, по которому на него смогут ссылаться другие. Для сервера это оправдано – на него ссылаются. А клиент сам ссылается – зачем ему порт? Тем более, что указывая конкретный порт ты разрешаешь только один сокет с твоей машины – остальные не смогут занять уже занятый порт.
Твой код должен работать по-идее, проверь чтоб порт не был занят.
 

Cris

Member
А можно узнать – нафига козе баян? Порты нужны, чтоб привязать сокет к уникальному имени, по которому на него смогут ссылаться другие. Для сервера это оправдано – на него ссылаются. А клиент сам ссылается – зачем ему порт? Тем более, что указывая конкретный порт ты разрешаешь только один сокет с твоей машины – остальные не смогут занять уже занятый порт.
Твой код должен работать по-идее, проверь чтоб порт не был занят.
хм... а как тогда браузеры работает только через 80(по умолчанию) порт, игры на определенный + в несколько окон + фаерволом закрыты все остальные?
 

dreamer

Member
хм... а как тогда браузеры работает только через 80(по умолчанию) порт, игры на определенный + в несколько окон + фаерволом закрыты все остальные?
Файрволы обычно закрывают порты серверов, а не клиентов. На исходящие соединения – для браузеров, игр и т.д. и на входящие соединения для локальных серверов – торренты, апач и проч.
 
Зверху