Keresés szöveg file-ban c-vel (10M körüli....)

Keresés szöveg file-ban c-vel (10M körüli....)
2007-02-27T20:11:02+01:00
2007-03-05T13:15:05+01:00
2022-11-03T16:20:37+01:00
Öcsisajt
Sziasztok!
Volna egy elég lámer kérdésem. Szöveges fájlokban kell keresgélnem. Miután Java-ban sikerült, gondoltam (naívan) biztos menni fog c-ben is.
Egy remek tutorial segítségével (the forgers....)magamévá tettem a win32 api alapjait (finoman szólva az alapjait) és nosza.
Az eredmény: valami pointeres kavarással sikerül a windowst fagyasztanom.....
Fordítónak a Borland parancssori csodáját használom (BCC++5.5)
A fagyás tünetei: windows hibaüzenet..., de van amikor csak a kis alkalmazás más részein keveri össze a szövegeket pl....


A BCC55 nem hajlandó valamiért az io.h függyvényeit fordítani, ezért barkácsoltam mindenfélét....
A segítséget előre is köszönöm
Mutasd a teljes hozzászólást!
a keresést pedig elvégezheted úgy h. pl. tokenekre bontod a beolvasott sorokat!
Ezt nagyon egyszerűen meg lehet valósítani az strtok() fv-el!

pl:

#include <stdio.h> #include <string.h> int main( void ) { char str[ 100 ] = "-egy proba, bemeneti; sztring? vagy nem!? de."; char *valaszto = " ,.-;!?"; char *p; printf( "A sor:\n\"%s\"\nSzetbontasa tokenekre:\n\n", str ); p = strtok( str, valaszto ); while( p != NULL ) { printf( "\"%s\"\n", p ); p = strtok( NULL, valaszto ); } return 0; }

char *valaszto = " ,.-;!?";
-ban adhatod meg, hogy milyen karakterek választhatják el egymástól a szavakat!

Összehasonlítás meg mehet az strstr() fv-el, de ennek már nem írnám le a működését!
Lényege: azt vizsgálja hogy az egyik paramétere része-e a másiknak (mindkettő char* típusú)!
Mutasd a teljes hozzászólást!

  • a CreateFile-t szurtad el a 13. sorban!
    Mutasd a teljes hozzászólást!
  • Igen, szerintem is, a dwFlagsAndAttribute-ból hiányzik a OPEN_EXISTING flag.

    De mintha a tömböt is túlcímezte volna a 19. sorban, nem???
    Mutasd a teljes hozzászólást!
  • Tenyleg, arra nem is figyeltem fel!
    Mutasd a teljes hozzászólást!
  • Nem! A dwFlagsAndAttribute-ban benne van a CREATE_NEW, gondolom.
    És a dwDesiredAccess-ben csak annyi van, hogy GENERIC_THOUGHT_READING, ez már biztos!
    Mutasd a teljes hozzászólást!
  • és ezeket a stdio.h könyvtárban elhelyezkedő fv-ket próbáltad már:

    fgets(), fscanf(), fread() ?

    kis segítség

    ha mindenáron az io.h-val akarsz boldogulni, akkor:
    nézd meg ezt
    Mutasd a teljes hozzászólást!
  • Bocs lehet hogy rosz helyre kattintottam....
    Szóval a megoldási javaslatok nem igazán jöttek be.
    char* subString(char *beString,int tol,int ig) { int i,hoszSub,seged=0; char *kiString=""; hoszSub=strlen(beString); for(i=0;i<hoszSub-1;i++) { if(i>=tol && i<=ig) { *(kiString+seged)=*(beString+i); seged++; } } return kiString; } char* merValtKeres(char *sorString) { char CHDIM[] = "CD_CHDIM I-Fin envoi recette"; char *meretValtas,*gepDimension,*Datum,*aux1; char *enter,*kimenet; int hosz,komp; enter = " \n"; hosz=strlen(sorString); if(hosz>53) { aux1=subString(sorString,24,53); } komp=strcmp(CHDIM,aux1); if(komp==0) { Datum=subString(sorString,0,19); meretValtas=aux1; gepDimension=subString(sorString,hosz-48,hosz-1); strcat(kimenet,Datum); strcat(kimenet,meretValtas); strcat(kimenet,gepDimension); strcat(kimenet,enter); } return kimenet; } BOOL TXTFajlNyit(HWND NYEditTerulet, LPCTSTR pszFileName) { FILE *FajlO = fopen(pszFileName,"r"); BOOL bSuccess=FALSE; int i,strHosz; long FMeret=0; char *sorStr,*kiStr,*merValtStr; while(fgetc(FajlO)!=EOF) { fgetc(FajlO); FMeret++; } rewind(FajlO); sorStr = (char *)calloc(202,sizeof(char)); merValtStr = (char *)calloc(202,sizeof(char)); kiStr = (char *)calloc(FMeret,sizeof(char)); if(!sorStr || !kiStr || !merValtStr) { bSuccess = FALSE; free(sorStr); free(kiStr); free(merValtStr); fclose(FajlO); return bSuccess; } do { fgets(sorStr,200,FajlO); merValtStr=merValtKeres(sorStr); //merValtStr=" Nyuszi "; strcat(kiStr,merValtStr); }while (!(feof(FajlO))); if(SetWindowText(NYEditTerulet,kiStr)) bSuccess = TRUE; else bSuccess=FALSE; free(sorStr); free(kiStr); free(merValtStr); fclose(FajlO); return bSuccess; }
    Valahol a merValtKeres függvény hívásánál kezdődik a baj. Meg nem tudom hogyan mérjem meg a fájl méretét, hogy akkora karakter tömböt foglaljak....?????
    Úgyhogy a kérdés még mindig maradt.........
    Mutasd a teljes hozzászólást!
  • Egy bemenet.txt nevű fájlnak így tudod meghatározni a méretét:

    #include <stdio.h> #include <stdlib.h> int main( void ) { FILE *fin = fopen ( "bemenet.txt", "r" ); long meret; if( fin == NULL ) { fputs( "Hiba a beolvasasnal!", stderr ); exit( 1 ); } /* Fájl méretének meghatározása */ fseek( fin, 0, SEEK_END ); meret = ftell( fin ); rewind( fin ); printf( "bemenet.txt merete: %f\n", ( float )meret / 1024.0 ); fclose( fin ); return 0; }

    de sokkal gyorsabb, ha így olvasol be: (egyben lehet pazarlóbb is)

    #include <stdio.h> #include <stdlib.h> #define MAX_SOR_HOSSZ 10000 int main( void ) { FILE *fin = fopen ( "bemenet.txt", "r" ); char sor[ MAX_SOR_HOSSZ ]; long i = 0; if( fin == NULL ) { fputs( "Hiba a beolvasasnal!", stderr ); exit( 1 ); } while( fgets( sor, MAX_SOR_HOSSZ, fin ) != NULL ) { /* Itt lehet feldolgozni az éppen beolvasott sort */ i++; } printf( "A beolvasott sorok szama: %d\n", i ); fclose( fin ); return 0; }
    Mutasd a teljes hozzászólást!
  • Meg nem tudom hogyan mérjem meg a fájl méretét, hogy akkora karakter tömböt foglaljak....?????


    GetFileSize megmondja, a file méretét, malloc pedig annyi helyet foglal a tömbnek amennyit akarsz. Na jó, nem épp amennyit akarsz...
    Nézelődj egy kicsit a helpben.
    Mutasd a teljes hozzászólást!
  • _fstat nem lenne jobb fseek + ftell + rewind helyett?
    Mutasd a teljes hozzászólást!
  • a keresést pedig elvégezheted úgy h. pl. tokenekre bontod a beolvasott sorokat!
    Ezt nagyon egyszerűen meg lehet valósítani az strtok() fv-el!

    pl:

    #include <stdio.h> #include <string.h> int main( void ) { char str[ 100 ] = "-egy proba, bemeneti; sztring? vagy nem!? de."; char *valaszto = " ,.-;!?"; char *p; printf( "A sor:\n\"%s\"\nSzetbontasa tokenekre:\n\n", str ); p = strtok( str, valaszto ); while( p != NULL ) { printf( "\"%s\"\n", p ); p = strtok( NULL, valaszto ); } return 0; }

    char *valaszto = " ,.-;!?";
    -ban adhatod meg, hogy milyen karakterek választhatják el egymástól a szavakat!

    Összehasonlítás meg mehet az strstr() fv-el, de ennek már nem írnám le a működését!
    Lényege: azt vizsgálja hogy az egyik paramétere része-e a másiknak (mindkettő char* típusú)!
    Mutasd a teljes hozzászólást!
  • sztem az nem része az ANSI C-nek
    és ami nem része annak, azokhoz még annyira sem értek!

    ---
    szerk:
    a karaktertömbökhöz memóriát foglalni sztem szerencsésebb a calloc() fv-el.
    Mutasd a teljes hozzászólást!
  • 1.)
    sztem az nem része az ANSI C-nek

    Igazad van.

    2.)A calloc() tk. meghívja a malloc() fv.-t utána pedig kinullázza a tömböt.
    Én malloc()-ot szoktam használni. Igaz, ha calloc()-ot használnánk, egy sorral rövidebb lenne a kódunk, de csak akkor, ha nullázni kell a tömböt.
    Ha nem kell nullázni, akkor gyorsabb a malloc().
    Mondjuk ez már szokás kérdése.
    char* mtomb = NULL; char* ctomb = NULL; mtomb = (char*)malloc( MERET ); if ( NULL != mtomb ) { memset( mtomb, 0, sizeof( char ) ); .... } ctomb = (char*)calloc( MERET, sizeof( char ) ); if ( NULL != ctomb ) { .... } free(..)
    Mutasd a teljes hozzászólást!
  • klorand, Ivn, @sanya...
    Szép flame volt!
    Mutasd a teljes hozzászólást!
  • Örülök, hogy tetszett. De ha már ki kell kitalálni, hogy hol- melyik sorban tévedtél és hogy a gondoltolvasó flag-et hogy kell beállítani az nem flamezés.

    Tetszett ahogy elmondottad és pontosan leírtad, hogy mi a bajod:
    Az eredmény: valami pointeres kavarással sikerül a windowst fagyasztanom.....
    A fagyás tünetei: windows hibaüzenet..., de van amikor csak a kis alkalmazás más részein keveri össze a szövegeket pl....


    szerk:
    Most látom, hogy nem te vagy a Túró Rudi.
    Mutasd a teljes hozzászólást!
  • Kosz, igyekeztem...

    (Most komolyan. Ideallit, hogy ez es ez a gond, talaljuk ki neki, hogy mi a kod, es mi a hiba benne...
    Nem flame-nek szantam, csak megprobaltam az en mokas stilusomban (?) felhivni a figyelmet egy apro hianyossagra a kerdeseben...)
    Mutasd a teljes hozzászólást!
  • Köszönöm a segítséget mindenkinek.
    Végül az strtok() függvény segített ki a bajból a keresésben, és afájlméret meghatározása is dobott egyet a dolgon

    Szóval köszönöm screeam-nak az ötleteket
    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