Czytanie pliku po slowie w C

Odpowiedz Nowy wątek
2016-02-06 20:02

Rejestracja: 8 lat temu

Ostatnio: 4 lata temu

0

Witam,

mam problem z prostą rzeczą,
mój cel:
czytanie pliku słowo po słowie z uwzględnieniem nowych linii,

robie to tak:

char *getWord(FILE *fp)
{
    int n = 0; 
    char word[100]; 
    int ch;     

    while(ch = fgetc(fp))
    {
        if(ch == EOF)
            return NULL;
        else if(ch == '\n')
        {   
            word[n++] ='\n';
            break;          
        }
        else if(ch == ' ')
        {
            word[n++] = ' '; 
            break;
        }       
        else if(isalpha(ch))
            word[n++] = ch;
        else continue;                  
    }
    if(!n) return NULL;
    return strdup(word);
}

mój tekst:

czesc siema
hey
jestem tutaj

wychodzi:

czesc siema
iema hey
a jestem tutaj

Z góry dzięki za pomoc i naukę.

edytowany 1x, ostatnio: maniaq, 2016-02-06 20:03

Pozostało 580 znaków

2016-02-06 20:19

Rejestracja: 14 lat temu

Ostatnio: 37 sekund temu

1
char *getWord(FILE *fp)
  {
   size_t size=0; 
   char word[100];
   int ch;     
   while((size+1<sizeof(word))&&(isalpha(ch=fgetc(fp)))) word[size++]=ch;
   word[size]=0;
   return size?strdup(word):NULL;
  }

ale pamiętaj że to jest zły pomysł zwracać coś za co się nie niesie odpowiedzialności.
Radzę jednak:

const char *getWord(FILE *fp)
  {
   static char word[100];
   size_t size=0; 
   int ch;     
   while((size+1<sizeof(word))&&(isalpha(ch=fgetc(fp)))) word[size++]=ch;
   word[size]=0;
   return size?word:NULL;
  }

strdup zastosujesz na zewnątrz, ale takie podejście jest niebezpieczne przy wielowątkowości, więc:

const char *getWord(FILE *fp,char word[],size_t wordsize)
  {
   size_t size=0; 
   int ch;
   while((size+1<wordsize)&&(isalpha(ch=fgetc(fp)))) word[size++]=ch;
   word[size]=0;
   return size?word:NULL;
  }

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

2016-02-06 20:34

Rejestracja: 4 lata temu

Ostatnio: 2 miesiące temu

1

Moze po prostu tak: :P

#include <stdio.h>
int main()
{
    int znak;
    FILE *plik;
    plik = fopen("test.txt", "r");
    znak = getc(plik);
    while(znak != EOF)
    {
        printf("%c", znak);
        znak = getc(plik);
    }
    fclose(plik);
    return 0;
}

Efekt:
user image

edytowany 2x, ostatnio: Blue_Carpet, 2016-02-06 20:35
6 wierszy zamiast jednego!? while((znak=getc(plik))!=EOF) putchar(znak); WTF? - ale z całą pewnością nie o to chodziło. - _13th_Dragon 2016-02-06 20:41

Pozostało 580 znaków

2016-02-07 09:29

Rejestracja: 8 lat temu

Ostatnio: 4 lata temu

0

Zadna odpowiedz nie uwzględnia nowych linii a to jest mój główny problem :) Byłbym również wdzięczny za pokazanie co w moim programie jest nie tak, na logikę powinien działać :)

edytowany 2x, ostatnio: maniaq, 2016-02-07 09:32

Pozostało 580 znaków

2016-02-07 09:42

Rejestracja: 14 lat temu

Ostatnio: 37 sekund temu

0
maniaq napisał(a):

Zadna odpowiedz nie uwzględnia nowych linii ...
Na podstawie czego to stwierdziłeś?! Wszystkie podane 5 wersji uwzględniają nowe linii. http://ideone.com/BdFfow

maniaq napisał(a):

... a to jest mój główny problem
Twoim głównym problemem jest brak podstaw, radzę przeczytać byle kurs.

maniaq napisał(a):

Byłbym również wdzięczny za pokazanie co w moim programie jest nie tak, na logikę powinien działać :)
Wywal to i zacznij od nowa.

@maniaq, Podaje to co wymagasz, ale z całą pewnością nie jest to tym czego potrzebujesz, zaś czego potrzebujesz - jeszcze nie zrozumiałeś.
http://ideone.com/dlD9W6

#include <stdio.h>
#include <ctype.h>
int main()
  {
   int ch;
   FILE *plik;
   plik=fopen("test.txt","r");
   while((ch=getc(plik))!=EOF) if((isalpha(ch))||(isspace(ch))) putchar(ch);
   fclose(plik);
   return 0;
  }

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
edytowany 1x, ostatnio: _13th_Dragon, 2016-02-07 17:37
Pokaż pozostałe 3 komentarze
To jakie ma być wyjście w tym twoim przykładzie z pierwszego postu? - _13th_Dragon 2016-02-07 10:31
powinno być wyjście takie same, a niestety nie jest... dlatego starałem się w moim kodzie przesyłać również \n ale nie chciało to działać, same słowa były ok. - maniaq 2016-02-07 13:06
W takim razie masz to co podał @Blue_Carpet tu http://4programmers.net/Forum/1223516 ewentualnie z moją optymalizacją w komentarzu. - _13th_Dragon 2016-02-07 13:55
no tak, wysyłanie po znaku - jak wpisze w input: ,, ;;; znak \n nowa linia" to będę miał to samo, razem ze średnikami. Tak jak pisałem, nie jest to tak oczywiste jak się zdaje na początku... - maniaq 2016-02-07 16:05
No własnie nie wytłumaczyłeś co chcesz osiągnąć, nazwa funkcji absolutnie nie odpowiada temu co opowiadasz. - _13th_Dragon 2016-02-07 17:33

Pozostało 580 znaków

Odpowiedz

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0