Szavak beolvasása file-ból C-ben

Szavak beolvasása file-ból C-ben
2017-11-24T15:59:45+01:00
2017-11-24T22:13:42+01:00
2022-12-04T22:20:43+01:00
villamroland
Sziasztok! Elég összetett a problémám. Most tanulok C-nyelvet és az Istennek se tudom megcsinálni ezt a részfeladatot. Adott egy magyar szavak listája (csatolva), és ebből kéne random generált (4-8 hosszú, nyilván minden megnyitásnál más) hosszúságú szavakat egy láncolt listába helyezni,  A többi szó nem fontos. Fontos, hogy láncolt listába legyenek, mert kötelező dinamikusan memóriát kezelni. Mindig csak az első szóig jutok, meg más hibák is vannak a programomban, egyszerűen nem tudom megcsinálni.  Ha megnyitom notepaddel a txt-t úgy látom enter van a szavak között, de én már ebben se vagyok biztos. Előre is köszönöm, ha valaki tud segíteni, szép napot!

Itt van amit eddig írtam, már összevissza módosítottam, szóval elég átláthatatlan.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>

typedef struct szolista{
char szavak[9];
struct szolista *kov;
} szolista;




int randszam(){
srand(time(NULL));
int n = (rand() % 4)+5;
return n;
}

int main()
{
int szohossz;
szohossz = randszam();
char ideig[40];  //nem tudni milyen husszú kell
int i;
int meret = 0;
int counter = 0;
szolista *lista;
szolista *eleje;
FILE * fp;
fp = fopen("magyar_ascii.txt","r");
while (!feof(fp))
{
fscanf(fp,"%[^\n]",&ideig);
for(i=0;ideig != '\0';++i){
meret++;
}
printf("%s\n", ideig);
if(meret==szohossz){
if(counter==0){
lista = (szolista*) malloc(sizeof(szolista));
lista->kov = NULL;
for(i=0;ideig != '\0';++i){
lista->szavak = ideig;
}
lista->szavak[i+1] = '\0';
counter++;
}
else if(counter>0){
eleje = (szolista*) malloc(sizeof(szolista));
eleje->kov = eleje;
for(i=0;ideig != '\0';++i){
lista->szavak = ideig;
}
lista->szavak[i+1] = '\0';

}
}

}
return 0;
}

Mutasd a teljes hozzászólást!
Csatolt állomány
Hali, kezd a beolvasásnál, pl:
#include <stdio.h> #include <stdlib.h> #include <string.h> struct list { char *string; struct list *next; }; typedef struct list LIST; int main(void) { FILE *fp; char line[128]; LIST *current, *head; head = current = NULL; fp = fopen("magyar_ascii.txt", "r"); while(fgets(line, sizeof(line), fp)){ LIST *node = malloc(sizeof(LIST)); node->string = strdup(line); node->next =NULL; if(head == NULL){ current = head = node; } else { current = current->next = node; } } fclose(fp); // most a láncolt listában van az összes szó, innen folytasd // teszt, hogy lásd, tényleg ott van. :) for(current = head; current ; current=current->next){ printf("%s", current->string); } return 0; }
Mutasd a teljes hozzászólást!

  • </> forráskód gombot használd a forráskód beillesztésére, mert így ronda, és eltűnnek az indexelések is...
    Mutasd a teljes hozzászólást!
  • Kérlek, keresd meg a </>forráskód</> gombot.
    Mutasd a teljes hozzászólást!
  • Amúgy meg a szavak között lf vagyis \n azaz char(10) van, de ezt bármilyen normális szövegszerkesztővel meg tudod nézni (pl.: notepad++)

    És amúgy itt is a hibád, te \0 -t nézel, ami null lenne, viszont a txt fájlok (normál esetben) nem null-al vannak elválasztva, hanem vagy line feedel \n (linux, c++ is ezt használja), vagy \r carriage returnal(os), vagy mindkettővel \r\n (windows).

    Amit neked kell cisnálnod az ez:
    egy ciklus ami végig lépeket az egész fájlon:
    ++lenght;
    currentchar == "\n" ? (lenght == amiylenhoszatakarsz ? csinálod amit kell : lenght = 0) : ;


    Egyébként: régen volt ahol \0-t azaz nullt használtak sortörésre, ugyanis a régi dos-os rendszereken a szövegmegnyitásra alkalmas hétköznapi programok nem láttak tovább a \0-on(azt hiték ott a fájl vége), így gyakorlatilag el lehetett rejteni a tartalmát az átlag userek elől.
    Mutasd a teljes hozzászólást!
  • #include <stdio.h> #include <stdlib.h> #include <time.h> #include <string.h> typedef struct szolista{ char szavak[9]; struct szolista *kov; } szolista; void szab(){ printf("kesobb ide jonnek a szabalyok"); } int randszam(){ srand(time(NULL)); int n = (rand() % 4)+5; return n; } int main() { printf("Udv az akasztofa jatekban!\n"); printf("1: szabalyok\n2:jatek\n"); int menupont; do { scanf("%d", &menupont); switch (menupont) { case 1: szab(); break; case 2: break; default: printf("helytelen input\n"); break; } } while (menupont != 2); //eldonteni hany betus a szo int szohossz; szohossz = randszam(); char ideig[40]; //nem tudni milyen husszú kell int i; int meret = 0; int counter = 0; szolista *lista; szolista *eleje; FILE * fp; fp = fopen("magyar_ascii.txt","r"); while (!feof(fp)) { fscanf(fp,"%[^\n]",&ideig); for(i=0;ideig != '\0';++i){ meret++; } if(meret==szohossz){ if(counter==0){ lista = (szolista*) malloc(sizeof(szolista)); lista->kov = NULL; for(i=0;ideig != '\0';++i){ lista->szavak = ideig; } lista->szavak[i+1] = '\0'; counter++; printf("counter%d",counter); } else if(counter>0){ eleje = (szolista*) malloc(sizeof(szolista)); eleje->kov = eleje; for(i=0;ideig != '\0';++i){ lista->szavak = ideig; } lista->szavak[i+1] = '\0'; } } } return 0;

    A feladat amúgy gonosz akasztófa, de egyenlőre a láncolt listám létrehozása lenne az első lépés.
    Tudom, hogy rossz a kód, lehet a láncolt lista létrehozás is. A for ciklusban a szó hosszát ellenőrizném, de tudom, hogy az se jó így, azért is kérek segítséget.
    Mutasd a teljes hozzászólást!
  • Van benne egy [i] ahol [ kellene legyen? (Vagy ismét fejlődött a fórummotor?)
    Mutasd a teljes hozzászólást!
  • Arra kérnélek titeket, hogy valaki tudna egy kódot írni, hogy a megfelelő hosszúságú szavakat (hosszát megadta a random generátor) egy struktúrába tudjam tenni. 

    typedef struct szolista{ char szavak[9]; struct szolista *kov; } szolista;
    A kov pointer ugye mutatna a következő annyi betűs szóra. Utána meg tudnám írni talán a gonosz akasztófát. 
     
    (Szokásos akasztófa játéknak tűnik: a gép gondol egy szót, a felhasználó pedig megpróbálja kitalálni azt olyan módon, hogy betűket tippel. A gonoszság abban rejlik, hogy a gép nem kötelezi el magát egyetlen egy szó mellett sem. A felhasználó tippjei alapján mindig úgy szűkíti a szóba jöhető szavak halmazát, hogy a legkevesebb segítséget adjon a felhasználónak. Pl. a felhasználó idáig eljutott: _k_r, és az „akár” szóra gondol. Ezért tippel egy a-t, mire a gép azt mondja, hogy veszített, mert a szó az „ökör” volt... Közben igazából nem is gondolt egyik szóra sem.)
    Mutasd a teljes hozzászólást!
  • Hali, kezd a beolvasásnál, pl:
    #include <stdio.h> #include <stdlib.h> #include <string.h> struct list { char *string; struct list *next; }; typedef struct list LIST; int main(void) { FILE *fp; char line[128]; LIST *current, *head; head = current = NULL; fp = fopen("magyar_ascii.txt", "r"); while(fgets(line, sizeof(line), fp)){ LIST *node = malloc(sizeof(LIST)); node->string = strdup(line); node->next =NULL; if(head == NULL){ current = head = node; } else { current = current->next = node; } } fclose(fp); // most a láncolt listában van az összes szó, innen folytasd // teszt, hogy lásd, tényleg ott van. :) for(current = head; current ; current=current->next){ printf("%s", current->string); } return 0; }
    Mutasd a teljes hozzászólást!
  • Hú, ez nagyon jó, köszönöm :)

    Akkor most töröljem ki a listából azokat az elemeket amik nem megfelelő hosszúságúak igaz?
    Így akkor egyszerűbb, mint csak azokat a hosszúságúakat beolvasni, jól gondolom?

    Még egyszer köszönöm :)
    Mutasd a teljes hozzászólást!
  • Így akkor egyszerűbb, mint csak azokat a hosszúságúakat beolvasni, jól gondolom?

    Én a feltételt a láncolt listához hozzáadás előtt vizsgálnám meg. Amennyiben nem megfelelő, akkor legegyszerűbb hozzá sem adni a láncolt listához..
    Mutasd a teljes hozzászólást!
  • Effektívebb is lenne előtte vizsgálni, hisz úgy elkerülöd a felesleges másolgatást, ami gyorsabb kódot eredményez.
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd