[ Príspevkov: 31 ] 1, 2
AutorSpráva
Offline

Užívateľ
Užívateľ
Načítanie zo súbora

Registrovaný: 07.04.12
Prihlásený: 02.06.21
Príspevky: 907
Témy: 54 | 54
NapísalOffline : 01.11.2013 14:21 | Načítanie zo súbora

Dobrý deň,
prosím vás, mám takýto vstup:
Vstup.in: zobraziť
Kód:
9 66
52
11 7  14 8  12 10
300500000
zatancuj si so mnou boogie boogie krasna neznama
124 100 132 100
7 27
...........................
.A..A.K..K.N...N.EEEE.LLLL.
.A..A..K.K.NN..N....E....L.
.AAAA...KK.N.N.N..EEE....L.
.A..A..K.K.N..NN....E....L.
..AA..K..K.N...N.EEEE....L.
...........................
8 3
4 4 6 3
9 7 11 6
5 7 7 6
5 2 7 1
7 8 8 5
9 4 10 2
2 9 3 6
9 11 10 9

A ten by som potreboval nejakým spôsobom načítať, aby som mal prístup ku každému znaku(jednotlivé čísla), resp. slovu(zatancuj si so mnou...) alebo celému riadku(ako je otočený ten nápis "LENKA", ktorý budem musieť potom v prog. správne vypísať).

Zatiaľ mám niečo takéto:
Riadky: zobraziť
Kód:
    for(i=1;i<=23;i++) {
    do {
         riadok = fgetc(fr);
         fputc(riadok, stdout);
     } while (riadok != '\n');   
}

Alebo toto
Riadky: zobraziť
Kód:
    for( i = 0; i < vyska; i++ )
        for( j = 0; j < sirka; j++ )
            fscanf( fr, "%f", &matica[i][j] );

To nie je moc vhodné.
Čo v podstate funguje, lenže to mi len prečíta po riadkoch a vypíše ho, takže ho nemám nikde uložený(som myslel, že ten riadok uložiť do pola, následne ho "rozstrihať" napr. pomocou strtok a potom tak k nemu pristupovať) a aj počet riadkov píšem len manuálne. Tam som skúšal niečo takéto, tu mi aj vypíše číslo 23, lenže následne vypisuje len prázdne riadky.
Počet riadkov: zobraziť
Kód:
while(ch!=EOF) {
        ch = fgetc(fr);
        if(ch == '\n')  lines++;
    }


BTW ide o C.
Vopred ďakujem za akúkoľvek pomoc.


Naposledy upravil ado130 dňa 01.11.2013 15:07, celkovo upravené 1

_________________
Notebook: Dell Inspiron 15-7537= i5-4200U|nVidia GT 750M 2GB|RAM 6GB|250GB Samsung 850 EVO|W8.1|Cooler Master NotePal U3
Pc: Asus Rog Strix B360-G | i7-8700 | MSI 1080 Gaming X | Crucial Ballistix 16GB 2666MHz Dual Ranked | Samsung 970 Evo | Crucial MX500 | WD Red | Fera 3 | Arctic F12 Silent | Seasonic Focus Plus 650W Gold | Fractal Design Mini C TG
Disk: Western Digital Elements 1TB USB 2.0; Seagate Expansion 2TB USB 3.0
Príslušenstvo: A4tech Bloody V3 V-Track Core 3 + A4tech Bloody B-070; A4tech Bloody B120; A4tech Bloody G501; ATH-M40x; MSI Clutch M40
Monitor: Dell U2515H
Mobil: Xiaomi Redmi Note 3 Special Edition
Offline

Skúsený užívateľ
Skúsený užívateľ
Obrázok užívateľa

Registrovaný: 17.07.11
Prihlásený: 29.12.20
Príspevky: 1516
Témy: 3 | 3
NapísalOffline : 01.11.2013 15:04 | Načítanie zo súbora

No a kde máš problém? Nevieš pracovať s polom? Riadok načítať vieš...


_________________
Na súkromné správy týkajúce sa problémov, ktoré sa riešia vo fóre, neodpovedám!
Offline

Užívateľ
Užívateľ
Načítanie zo súbora

Registrovaný: 07.04.12
Prihlásený: 02.06.21
Príspevky: 907
Témy: 54 | 54
Napísal autor témyOffline : 01.11.2013 15:14 | Načítanie zo súbora

Áno, neviem ako by som jednotlivé riadky zapísal do pola.
Napr. riadok[0] - 1. riadok, riadok[1] - 2. riadok, atď.
Takže potom by som mohol k ním tak pristupovať, následne si ich cez http://www.cplusplus.com/reference/cstring/strtok/ rozdeliť na jednotlivé časti, ktoré budem potrebovať.


_________________
Notebook: Dell Inspiron 15-7537= i5-4200U|nVidia GT 750M 2GB|RAM 6GB|250GB Samsung 850 EVO|W8.1|Cooler Master NotePal U3
Pc: Asus Rog Strix B360-G | i7-8700 | MSI 1080 Gaming X | Crucial Ballistix 16GB 2666MHz Dual Ranked | Samsung 970 Evo | Crucial MX500 | WD Red | Fera 3 | Arctic F12 Silent | Seasonic Focus Plus 650W Gold | Fractal Design Mini C TG
Disk: Western Digital Elements 1TB USB 2.0; Seagate Expansion 2TB USB 3.0
Príslušenstvo: A4tech Bloody V3 V-Track Core 3 + A4tech Bloody B-070; A4tech Bloody B120; A4tech Bloody G501; ATH-M40x; MSI Clutch M40
Monitor: Dell U2515H
Mobil: Xiaomi Redmi Note 3 Special Edition
Offline

Skúsený užívateľ
Skúsený užívateľ
Obrázok užívateľa

Registrovaný: 17.07.11
Prihlásený: 29.12.20
Príspevky: 1516
Témy: 3 | 3
NapísalOffline : 01.11.2013 15:30 | Načítanie zo súbora

No princíp je jednoduchý. Ak to ale má byť v čistom C-čku, tak sa trochu veru potrápiš na réžií pola. Potrebuješ totiž pole zväčšiť podľa potreby.
Povedzme, že sa môžeš aspoň spoliehať na nejakú maximálnu dĺžku riadka. Tak si urobíš (dynamicky!) pole[10][MAX_DLZKA_RIADKA], takže predpokladáš 10 riadkov. Tak prečítaš riadky (trebárs cez funkciu gets) a ukladáš ich postupne do pola.
Ak ale prídeš k 11. riadku, musíš pole zväčšiť cez funkcie realloc, alebo znovu free+malloc.

Takto to nacpeš všetko do pamäte, ale porozmýšľaj skôr, či riadky nemôžeš spracovávať postupne. Bolo by to rozumnejšie.


_________________
Na súkromné správy týkajúce sa problémov, ktoré sa riešia vo fóre, neodpovedám!
Offline

Užívateľ
Užívateľ
Načítanie zo súbora

Registrovaný: 07.04.12
Prihlásený: 02.06.21
Príspevky: 907
Témy: 54 | 54
Napísal autor témyOffline : 01.11.2013 15:39 | Načítanie zo súbora

No ja počet riadkov budem vedieť. Keďže budem mať k dispozícií vstupný súbor, tak počet riadkov si môžem odčítať, prípadne si to vypíšem celé a pridám aj riadkovanie, takže zistím koľko riadkov má súbor.
Kód:
for(i=1;i<=23;i++) {
    printf("%d. ", i);
    do {
         riadok = fgetc(fr);
         fputc(riadok, stdout);
     } while (riadok != '\n');
}

Len neviem ako tie riadky dám do poľa.


_________________
Notebook: Dell Inspiron 15-7537= i5-4200U|nVidia GT 750M 2GB|RAM 6GB|250GB Samsung 850 EVO|W8.1|Cooler Master NotePal U3
Pc: Asus Rog Strix B360-G | i7-8700 | MSI 1080 Gaming X | Crucial Ballistix 16GB 2666MHz Dual Ranked | Samsung 970 Evo | Crucial MX500 | WD Red | Fera 3 | Arctic F12 Silent | Seasonic Focus Plus 650W Gold | Fractal Design Mini C TG
Disk: Western Digital Elements 1TB USB 2.0; Seagate Expansion 2TB USB 3.0
Príslušenstvo: A4tech Bloody V3 V-Track Core 3 + A4tech Bloody B-070; A4tech Bloody B120; A4tech Bloody G501; ATH-M40x; MSI Clutch M40
Monitor: Dell U2515H
Mobil: Xiaomi Redmi Note 3 Special Edition
Offline

Skúsený užívateľ
Skúsený užívateľ
Obrázok užívateľa

Registrovaný: 17.07.11
Prihlásený: 29.12.20
Príspevky: 1516
Témy: 3 | 3
NapísalOffline : 01.11.2013 15:45 | Načítanie zo súbora

Kód:
char ** pole = malloc( 23 * sizeof(pole) );
for(i=0;i<23;i++) { // pole sa indexuje od nuly!
    printf("%d. ", i);
    pole[i] = malloc( 256 * sizeof(char) ); // max dĺžka riadka je 256
    gets( pole[i] );
}
malo by to ísť, snáď som to nedoplietol.

Videl si už niečo takéto vôbec?


_________________
Na súkromné správy týkajúce sa problémov, ktoré sa riešia vo fóre, neodpovedám!
Offline

Užívateľ
Užívateľ
Načítanie zo súbora

Registrovaný: 07.04.12
Prihlásený: 02.06.21
Príspevky: 907
Témy: 54 | 54
Napísal autor témyOffline : 01.11.2013 15:51 | Načítanie zo súbora

To je dobrá otázka, práve že ani nie, resp. nejak neviem ako mi to teraz v tomto konkrétnom probléme pomôže, pri zapisovaní riadka do toho poľa.


_________________
Notebook: Dell Inspiron 15-7537= i5-4200U|nVidia GT 750M 2GB|RAM 6GB|250GB Samsung 850 EVO|W8.1|Cooler Master NotePal U3
Pc: Asus Rog Strix B360-G | i7-8700 | MSI 1080 Gaming X | Crucial Ballistix 16GB 2666MHz Dual Ranked | Samsung 970 Evo | Crucial MX500 | WD Red | Fera 3 | Arctic F12 Silent | Seasonic Focus Plus 650W Gold | Fractal Design Mini C TG
Disk: Western Digital Elements 1TB USB 2.0; Seagate Expansion 2TB USB 3.0
Príslušenstvo: A4tech Bloody V3 V-Track Core 3 + A4tech Bloody B-070; A4tech Bloody B120; A4tech Bloody G501; ATH-M40x; MSI Clutch M40
Monitor: Dell U2515H
Mobil: Xiaomi Redmi Note 3 Special Edition
Offline

Skúsený užívateľ
Skúsený užívateľ
Obrázok užívateľa

Registrovaný: 17.07.11
Prihlásený: 29.12.20
Príspevky: 1516
Témy: 3 | 3
NapísalOffline : 01.11.2013 15:51 | Načítanie zo súbora

Vieme čo je pole? A ako sa s ním v C-čku pracuje?


_________________
Na súkromné správy týkajúce sa problémov, ktoré sa riešia vo fóre, neodpovedám!
Offline

Užívateľ
Užívateľ
Načítanie zo súbora

Registrovaný: 07.04.12
Prihlásený: 02.06.21
Príspevky: 907
Témy: 54 | 54
Napísal autor témyOffline : 01.11.2013 15:58 | Načítanie zo súbora

Áno, teda podľa toho akú prácu, ale bohužiaľ len nejaké začiatky.
Asi som sa pustil do moc zložitej úlohy, išlo mi totiž len o to načítanie riadku a následnú prácu s ním.


Naposledy upravil ado130 dňa 01.11.2013 16:02, celkovo upravené 1

_________________
Notebook: Dell Inspiron 15-7537= i5-4200U|nVidia GT 750M 2GB|RAM 6GB|250GB Samsung 850 EVO|W8.1|Cooler Master NotePal U3
Pc: Asus Rog Strix B360-G | i7-8700 | MSI 1080 Gaming X | Crucial Ballistix 16GB 2666MHz Dual Ranked | Samsung 970 Evo | Crucial MX500 | WD Red | Fera 3 | Arctic F12 Silent | Seasonic Focus Plus 650W Gold | Fractal Design Mini C TG
Disk: Western Digital Elements 1TB USB 2.0; Seagate Expansion 2TB USB 3.0
Príslušenstvo: A4tech Bloody V3 V-Track Core 3 + A4tech Bloody B-070; A4tech Bloody B120; A4tech Bloody G501; ATH-M40x; MSI Clutch M40
Monitor: Dell U2515H
Mobil: Xiaomi Redmi Note 3 Special Edition
Offline

Skúsený užívateľ
Skúsený užívateľ
Obrázok užívateľa

Registrovaný: 17.07.11
Prihlásený: 29.12.20
Príspevky: 1516
Témy: 3 | 3
NapísalOffline : 01.11.2013 16:02 | Načítanie zo súbora

Tak si urob pre začiatok pole staticky, na začiatku ako pole[25][256] a urob (pre jednoduchosť si požičiam kód z http://www.cplusplus.com/reference/cstdio/fgets/ Ak ti niečo nebude jasné, študuj v dokumentácií)
Kód:
#include <stdio.h>

int main()
{
   FILE * pFile;
   char pole[25][256];
   int r = 0, i;

   pFile = fopen ("file.txt" , "r");
   if (pFile == NULL) perror ("Error opening file");
   else {
     if ( fgets (pole[r] , 256, pFile) != NULL )
     {
          r++;
     }
     fclose (pFile);
   }

   for( i = 0; i < r; i++ )
       puts( pole[i] );

   return 0;
}
Funguje to?

(btw. pred tým som písal o funkcií gets, mala to byť samozrejme fgets pre čítanie zo súboru, pardon)


_________________
Na súkromné správy týkajúce sa problémov, ktoré sa riešia vo fóre, neodpovedám!
Offline

Užívateľ
Užívateľ
Načítanie zo súbora

Registrovaný: 07.04.12
Prihlásený: 02.06.21
Príspevky: 907
Témy: 54 | 54
Napísal autor témyOffline : 01.11.2013 16:09 | Načítanie zo súbora

Ten prog. čo si poslal teraz, tak mi vypisuje 1. riadok zo súboru file.txt


_________________
Notebook: Dell Inspiron 15-7537= i5-4200U|nVidia GT 750M 2GB|RAM 6GB|250GB Samsung 850 EVO|W8.1|Cooler Master NotePal U3
Pc: Asus Rog Strix B360-G | i7-8700 | MSI 1080 Gaming X | Crucial Ballistix 16GB 2666MHz Dual Ranked | Samsung 970 Evo | Crucial MX500 | WD Red | Fera 3 | Arctic F12 Silent | Seasonic Focus Plus 650W Gold | Fractal Design Mini C TG
Disk: Western Digital Elements 1TB USB 2.0; Seagate Expansion 2TB USB 3.0
Príslušenstvo: A4tech Bloody V3 V-Track Core 3 + A4tech Bloody B-070; A4tech Bloody B120; A4tech Bloody G501; ATH-M40x; MSI Clutch M40
Monitor: Dell U2515H
Mobil: Xiaomi Redmi Note 3 Special Edition
Offline

Skúsený užívateľ
Skúsený užívateľ
Obrázok užívateľa

Registrovaný: 17.07.11
Prihlásený: 29.12.20
Príspevky: 1516
Témy: 3 | 3
NapísalOffline : 01.11.2013 16:15 | Načítanie zo súbora

Hej, teraz som si to všimol. Je tam jednoduchá chyba. Aby si tomu viac porozumel, skús prísť na to, kde je :)


_________________
Na súkromné správy týkajúce sa problémov, ktoré sa riešia vo fóre, neodpovedám!
Offline

Užívateľ
Užívateľ
Načítanie zo súbora

Registrovaný: 07.04.12
Prihlásený: 02.06.21
Príspevky: 907
Témy: 54 | 54
Napísal autor témyOffline : 01.11.2013 16:21 | Načítanie zo súbora

Len trochu neviem čo chceš aby to robilo?


_________________
Notebook: Dell Inspiron 15-7537= i5-4200U|nVidia GT 750M 2GB|RAM 6GB|250GB Samsung 850 EVO|W8.1|Cooler Master NotePal U3
Pc: Asus Rog Strix B360-G | i7-8700 | MSI 1080 Gaming X | Crucial Ballistix 16GB 2666MHz Dual Ranked | Samsung 970 Evo | Crucial MX500 | WD Red | Fera 3 | Arctic F12 Silent | Seasonic Focus Plus 650W Gold | Fractal Design Mini C TG
Disk: Western Digital Elements 1TB USB 2.0; Seagate Expansion 2TB USB 3.0
Príslušenstvo: A4tech Bloody V3 V-Track Core 3 + A4tech Bloody B-070; A4tech Bloody B120; A4tech Bloody G501; ATH-M40x; MSI Clutch M40
Monitor: Dell U2515H
Mobil: Xiaomi Redmi Note 3 Special Edition
Offline

Skúsený užívateľ
Skúsený užívateľ
Obrázok užívateľa

Registrovaný: 17.07.11
Prihlásený: 29.12.20
Príspevky: 1516
Témy: 3 | 3
NapísalOffline : 01.11.2013 16:24 | Načítanie zo súbora

Uloží všetky riadky súboru do pola. Na konci ich cez for vypíšeš pre kontrolu. To snáď chceš, nie?


_________________
Na súkromné správy týkajúce sa problémov, ktoré sa riešia vo fóre, neodpovedám!
Offline

Užívateľ
Užívateľ
Načítanie zo súbora

Registrovaný: 07.04.12
Prihlásený: 02.06.21
Príspevky: 907
Témy: 54 | 54
Napísal autor témyOffline : 01.11.2013 16:25 | Načítanie zo súbora

Áno presne to, tak skúsim nájsť tú chybu.

Edit: Keď ma aj zastrelíš neviem, netuším kde, resp. v čom je tá chyba.
Jedine čo ma napadlo, je
Kód:
#include <stdio.h>

int main()
{
   FILE * pFile;
   char pole[25][256];
   int r = 0, i, lines;

   pFile = fopen ("file.txt" , "r");
   if (pFile == NULL) perror ("Error opening file");
   else {
   for(lines=0;lines<=9;lines++){
     if ( fgets (pole[r] , 256, pFile) != NULL )
     {
          r++;
     }
   }
     fclose (pFile);
   }

   for( i = 0; i < r; i++ )
       puts( pole[i] );

   system("PAUSE");
   return 0;
}


Takže by to mohlo vyzerať nejak takto?:
Spoiler: zobraziť
Kód:
#include <stdio.h>

#define LINES 9

int main()
{
   FILE * pFile;
   int r = 0, i, j, line;
   char ** pole = malloc( LINES * sizeof(pole) );

   pFile = fopen ("file.txt" , "r");
   if (pFile == NULL) perror ("Error opening file");
   else {
       
        for(i=0;i<LINES;i++) {
         pole[i] = malloc( 256 * sizeof(char) );
         }
       
   for(line=0;line<=LINES;line++){
     if ( fgets (pole[r] , 256, pFile) != NULL )
     {
          r++;
     }
   }
     fclose (pFile);
   }

   for( j = 0; j < r; j++ )
       puts( pole[j] );


   system("PAUSE");
   return 0;
}


Naposledy upravil ado130 dňa 01.11.2013 16:55, celkovo upravené 3

_________________
Notebook: Dell Inspiron 15-7537= i5-4200U|nVidia GT 750M 2GB|RAM 6GB|250GB Samsung 850 EVO|W8.1|Cooler Master NotePal U3
Pc: Asus Rog Strix B360-G | i7-8700 | MSI 1080 Gaming X | Crucial Ballistix 16GB 2666MHz Dual Ranked | Samsung 970 Evo | Crucial MX500 | WD Red | Fera 3 | Arctic F12 Silent | Seasonic Focus Plus 650W Gold | Fractal Design Mini C TG
Disk: Western Digital Elements 1TB USB 2.0; Seagate Expansion 2TB USB 3.0
Príslušenstvo: A4tech Bloody V3 V-Track Core 3 + A4tech Bloody B-070; A4tech Bloody B120; A4tech Bloody G501; ATH-M40x; MSI Clutch M40
Monitor: Dell U2515H
Mobil: Xiaomi Redmi Note 3 Special Edition
Offline

Skúsený užívateľ
Skúsený užívateľ
Obrázok užívateľa

Registrovaný: 17.07.11
Prihlásený: 29.12.20
Príspevky: 1516
Témy: 3 | 3
NapísalOffline : 01.11.2013 16:50 | Načítanie zo súbora

Poznáš aj iný cyklus ako for? Čo taký while? Nehodil by sa tam niekde?


_________________
Na súkromné správy týkajúce sa problémov, ktoré sa riešia vo fóre, neodpovedám!
Offline

Užívateľ
Užívateľ
Načítanie zo súbora

Registrovaný: 07.04.12
Prihlásený: 02.06.21
Príspevky: 907
Témy: 54 | 54
Napísal autor témyOffline : 01.11.2013 17:06 | Načítanie zo súbora

Tak môže byť, napríklad takto?:
Kód:
#include <stdio.h>

#define LINES 9

int main()
{
   FILE * pFile;
   int r = 0, i, j, line;
   char ** pole = malloc( LINES * sizeof(pole) );

   pFile = fopen ("file.txt" , "r");
   if (pFile == NULL) perror ("Error opening file");
   else {
       
        for(i=0;i<LINES;i++) {
        pole[i] = malloc( 256 * sizeof(char) );
        }
       
         while(r != LINES){
                if ( fgets (pole[r] , 256, pFile) != NULL ) r++;
         }
         fclose (pFile);
   }

   for( j = 0; j < r; j++ )
       puts( pole[j] );


   system("PAUSE");
   return 0;
}


_________________
Notebook: Dell Inspiron 15-7537= i5-4200U|nVidia GT 750M 2GB|RAM 6GB|250GB Samsung 850 EVO|W8.1|Cooler Master NotePal U3
Pc: Asus Rog Strix B360-G | i7-8700 | MSI 1080 Gaming X | Crucial Ballistix 16GB 2666MHz Dual Ranked | Samsung 970 Evo | Crucial MX500 | WD Red | Fera 3 | Arctic F12 Silent | Seasonic Focus Plus 650W Gold | Fractal Design Mini C TG
Disk: Western Digital Elements 1TB USB 2.0; Seagate Expansion 2TB USB 3.0
Príslušenstvo: A4tech Bloody V3 V-Track Core 3 + A4tech Bloody B-070; A4tech Bloody B120; A4tech Bloody G501; ATH-M40x; MSI Clutch M40
Monitor: Dell U2515H
Mobil: Xiaomi Redmi Note 3 Special Edition
Offline

Skúsený užívateľ
Skúsený užívateľ
Obrázok užívateľa

Registrovaný: 17.07.11
Prihlásený: 29.12.20
Príspevky: 1516
Témy: 3 | 3
NapísalOffline : 01.11.2013 17:10 | Načítanie zo súbora

Joj nie, to čo je :lol: Kašli teraz na dynamickú alokáciu. Nechaj to staticky ako som to napísal.

Takto, funkcia fgets načíta jeden riadok a vráti NULL, ak už nemá čo načítavať. A teda vtedy, keď už všetko prečítala. Takže potrebujem cyklus
kým( funkcia fgets() nevráti NULL ) posuň index riadku;

Takže v tom mojom chybnom kóde stačí nahradiť slovícko if za slovíčko while a voala...


_________________
Na súkromné správy týkajúce sa problémov, ktoré sa riešia vo fóre, neodpovedám!
Offline

Užívateľ
Užívateľ
Načítanie zo súbora

Registrovaný: 07.04.12
Prihlásený: 02.06.21
Príspevky: 907
Témy: 54 | 54
Napísal autor témyOffline : 01.11.2013 17:20 | Načítanie zo súbora

Áha, to ma mohlo napadnúť, pozerám všetko robím nejakým ďalším zbytočným pridávaním premenných, funkcií, cyklov, ...
Takže už je to v podstate tak, ako som pôvodne chcel a môžem si tie riadky rozdeliť atď ako budem potrebovať.

Tebe patrí veľká vďaka, by som nad tým ešte asi mesiac maturoval..

Kód:
#include <stdio.h>

int main()
{
   FILE * pFile;
   char pole[25][256];
   int r = 0, i;

   pFile = fopen ("Vstup.in" , "r");
   if (pFile == NULL) perror ("Error opening file");
   else {
     while ( fgets (pole[r] , 256, pFile) != NULL )
     {
          r++;
     }
     fclose (pFile);
   }

   for( i = 0; i < r; i++ )
       puts( pole[i] );

   system("PAUSE");
   return 0;
}


_________________
Notebook: Dell Inspiron 15-7537= i5-4200U|nVidia GT 750M 2GB|RAM 6GB|250GB Samsung 850 EVO|W8.1|Cooler Master NotePal U3
Pc: Asus Rog Strix B360-G | i7-8700 | MSI 1080 Gaming X | Crucial Ballistix 16GB 2666MHz Dual Ranked | Samsung 970 Evo | Crucial MX500 | WD Red | Fera 3 | Arctic F12 Silent | Seasonic Focus Plus 650W Gold | Fractal Design Mini C TG
Disk: Western Digital Elements 1TB USB 2.0; Seagate Expansion 2TB USB 3.0
Príslušenstvo: A4tech Bloody V3 V-Track Core 3 + A4tech Bloody B-070; A4tech Bloody B120; A4tech Bloody G501; ATH-M40x; MSI Clutch M40
Monitor: Dell U2515H
Mobil: Xiaomi Redmi Note 3 Special Edition
Offline

Skúsený užívateľ
Skúsený užívateľ
Obrázok užívateľa

Registrovaný: 17.07.11
Prihlásený: 29.12.20
Príspevky: 1516
Témy: 3 | 3
NapísalOffline : 01.11.2013 17:24 | Načítanie zo súbora

A dokonca pozri, čo C-čko dokáže ;) Poriadne študuj teóriu čo ako funguje, veľmi ti to pomôže a všetko budeš robiť jednoducho a rýchlo :)
Kód:
else {
     while ( fgets (pole[r++] , 256, pFile) != NULL );
     fclose (pFile);
   }


_________________
Na súkromné správy týkajúce sa problémov, ktoré sa riešia vo fóre, neodpovedám!
Offline

Užívateľ
Užívateľ
Načítanie zo súbora

Registrovaný: 07.04.12
Prihlásený: 02.06.21
Príspevky: 907
Témy: 54 | 54
Napísal autor témyOffline : 01.11.2013 17:29 | Načítanie zo súbora

Áno máš pravdu, musím si lepšie prezrieť ten úvod, tak ešte raz vďaka.
Takže toto je staticky, ale hovoríš, že lepšie by bolo keby to bolo pomocou dynamickej alokácie pamäti?


_________________
Notebook: Dell Inspiron 15-7537= i5-4200U|nVidia GT 750M 2GB|RAM 6GB|250GB Samsung 850 EVO|W8.1|Cooler Master NotePal U3
Pc: Asus Rog Strix B360-G | i7-8700 | MSI 1080 Gaming X | Crucial Ballistix 16GB 2666MHz Dual Ranked | Samsung 970 Evo | Crucial MX500 | WD Red | Fera 3 | Arctic F12 Silent | Seasonic Focus Plus 650W Gold | Fractal Design Mini C TG
Disk: Western Digital Elements 1TB USB 2.0; Seagate Expansion 2TB USB 3.0
Príslušenstvo: A4tech Bloody V3 V-Track Core 3 + A4tech Bloody B-070; A4tech Bloody B120; A4tech Bloody G501; ATH-M40x; MSI Clutch M40
Monitor: Dell U2515H
Mobil: Xiaomi Redmi Note 3 Special Edition
Offline

Skúsený užívateľ
Skúsený užívateľ
Obrázok užívateľa

Registrovaný: 17.07.11
Prihlásený: 29.12.20
Príspevky: 1516
Témy: 3 | 3
NapísalOffline : 01.11.2013 17:30 | Načítanie zo súbora

Pri malých súboroch je to jedno, ale áno, všeobecne je vždy lepšie na väčší objem dát (ako napr. text) využívať dynamickú alokáciu pamäte.


_________________
Na súkromné správy týkajúce sa problémov, ktoré sa riešia vo fóre, neodpovedám!
Offline

Užívateľ
Užívateľ
Načítanie zo súbora

Registrovaný: 07.04.12
Prihlásený: 02.06.21
Príspevky: 907
Témy: 54 | 54
Napísal autor témyOffline : 01.11.2013 17:32 | Načítanie zo súbora

Aha tak, keď už sme pri tom, bolo by to nejako takto?:
Pri tom vstupe z 1. príspevku.
Kód:
#include <stdio.h>

int main()
{
   FILE * pFile;
   char ** pole = malloc( 23 * sizeof(pole) );
   int k = 0, i, j;

   pFile = fopen ("file.txt" , "r");
   if (pFile == NULL) perror ("Error opening file");
   else {
     for(i=0;i<23;i++) pole[i] = malloc( 256 * sizeof(char) ); // max dĺžka riadka je 256
     while ( fgets (pole[k++] , 256, pFile) != NULL );
     fclose (pFile);
   }

   for( j = 0; j < k-1; j++ )
       puts( pole[j] );

   system("PAUSE");
   return 0;
}


_________________
Notebook: Dell Inspiron 15-7537= i5-4200U|nVidia GT 750M 2GB|RAM 6GB|250GB Samsung 850 EVO|W8.1|Cooler Master NotePal U3
Pc: Asus Rog Strix B360-G | i7-8700 | MSI 1080 Gaming X | Crucial Ballistix 16GB 2666MHz Dual Ranked | Samsung 970 Evo | Crucial MX500 | WD Red | Fera 3 | Arctic F12 Silent | Seasonic Focus Plus 650W Gold | Fractal Design Mini C TG
Disk: Western Digital Elements 1TB USB 2.0; Seagate Expansion 2TB USB 3.0
Príslušenstvo: A4tech Bloody V3 V-Track Core 3 + A4tech Bloody B-070; A4tech Bloody B120; A4tech Bloody G501; ATH-M40x; MSI Clutch M40
Monitor: Dell U2515H
Mobil: Xiaomi Redmi Note 3 Special Edition
Offline

Skúsený užívateľ
Skúsený užívateľ
Obrázok užívateľa

Registrovaný: 17.07.11
Prihlásený: 29.12.20
Príspevky: 1516
Témy: 3 | 3
NapísalOffline : 01.11.2013 17:36 | Načítanie zo súbora

Ak to ide, tak je to správne. Ale tu je trochu zbytočné najprv prechádzať 23 krát a alokovať a potom znovu načítavať.
Môžeš naalokovať len prvý riadok (pole[0] = malloc...) a potom v tele cyklu while alokovať stále ďalší potrebný.


_________________
Na súkromné správy týkajúce sa problémov, ktoré sa riešia vo fóre, neodpovedám!
Offline

Užívateľ
Užívateľ
Načítanie zo súbora

Registrovaný: 07.04.12
Prihlásený: 02.06.21
Príspevky: 907
Témy: 54 | 54
Napísal autor témyOffline : 01.11.2013 19:20 | Načítanie zo súbora

Prosím ťa/vás, vedel by niekto zhruba poradiť, ako môžem rozdeliť daný ten riadok, ktorý mám uložený v poli, na jednotlivé znaky? Viem, teda myslím si, že to bude nejako pomocou funkcie http://www.cplusplus.com/reference/cstring/strtok/ ale vôbec neviem prísť nato.
Čiže podľa vstupu(1. príspevok), tak napr. v riadok[0] mám "9 66", a z toho potrebujem nejako dostať jednotlivé čísla 9 a 66.
Kód:
int a=1;
char *token;

token[0] = strtok(riadok[0], " ");
   while( token[0] != NULL )
   { 
      token[a] = strtok(NULL, " ");
      a++;
   }

Lenže, až tak "jednoducho" to nejde, ako som očakával.


Vopred veľmi ďakujem.

Celý_kód: zobraziť
Kód:
#include <stdio.h>

int main()
{
   FILE * rFile;
   FILE * wFile;
   int k = 0, i, j, l;
   char riadok[23][256];

   rFile = fopen ("Vstup.in" , "r");
   if (rFile == NULL) perror ("Error opening file");
   else {
     while ( fgets (riadok[k++] , 256, rFile) != NULL );
     fclose (rFile);
   }

   for( j = 0; j < k-1; j++ ) {
     printf("%d. ", j);
     puts( riadok[j] );
   }
 

   
   wFile = fopen ("Skola.out" , "w");
   if (rFile == NULL) perror ("Error opening file");
   else {
    fprintf(wFile, "1. cislo %d \n", cislo[0]);

    fclose (wFile);
   }
   system("PAUSE");
   return 0;
}


Naposledy upravil ado130 dňa 01.11.2013 20:04, celkovo upravené 1

_________________
Notebook: Dell Inspiron 15-7537= i5-4200U|nVidia GT 750M 2GB|RAM 6GB|250GB Samsung 850 EVO|W8.1|Cooler Master NotePal U3
Pc: Asus Rog Strix B360-G | i7-8700 | MSI 1080 Gaming X | Crucial Ballistix 16GB 2666MHz Dual Ranked | Samsung 970 Evo | Crucial MX500 | WD Red | Fera 3 | Arctic F12 Silent | Seasonic Focus Plus 650W Gold | Fractal Design Mini C TG
Disk: Western Digital Elements 1TB USB 2.0; Seagate Expansion 2TB USB 3.0
Príslušenstvo: A4tech Bloody V3 V-Track Core 3 + A4tech Bloody B-070; A4tech Bloody B120; A4tech Bloody G501; ATH-M40x; MSI Clutch M40
Monitor: Dell U2515H
Mobil: Xiaomi Redmi Note 3 Special Edition
Offline

Skúsený užívateľ
Skúsený užívateľ
Obrázok užívateľa

Registrovaný: 17.07.11
Prihlásený: 29.12.20
Príspevky: 1516
Témy: 3 | 3
NapísalOffline : 01.11.2013 19:59 | Načítanie zo súbora

ado130 píše:
Kód:
int a=1;
char *token;

token[0] = strtok(riadok[0], " ");
while( token[0] != NULL )

   token[a] = strtok(NULL, " ");
   a++;
}

Aby si mohol robiť toto, potrebuješ zase dvojrozmerné pole - resp. pole reťazcov (keďže vieme, že v C-čku je reťazec pole znakov)
Takže toto ti pôjde
Kód:
char * token = strtok(pole[i], " \n\r");
while( token != NULL )
{
    printf( "token('%s')\n", token );
    token = strtok(NULL, " \n\r");
}


Ak chceš mať pole tokenov, musíš urobiť pole reťazcov, takže char * token[32]; {obmedzím max počet tokenov na 32} a až vtedy môžeš robiť to, čo robíš s premennou a.


_________________
Na súkromné správy týkajúce sa problémov, ktoré sa riešia vo fóre, neodpovedám!
Offline

Užívateľ
Užívateľ
Načítanie zo súbora

Registrovaný: 07.04.12
Prihlásený: 02.06.21
Príspevky: 907
Témy: 54 | 54
Napísal autor témyOffline : 01.11.2013 20:17 | Načítanie zo súbora

Neviem či som dobre pochopil ako myslíš, no dám sem radšej celý kód.
Inak len, vlastne toto celé sa snažím pochopiť z dôvodu, ako načítať ten súbor tak, aby som mohol pracovať s tými číslami(použiť ich pri výpočtoch), teda aby som mal v nejakých premenných alebo poli tie čísla : 9, 66, 52, ..., prípadne v jednom reťazci celý riadok http://paste2.org/4AMJa4CU(8.-14.)

Kód:
#include <stdio.h>

int main()
{
   FILE * rFile;
   FILE * wFile;
   int k = 0, j, a=0;
   char riadok[23][256];
   char * token[40];
   
   rFile = fopen ("Vstup.in" , "r");
   if (rFile == NULL) perror ("Error opening file");
   else {
     while ( fgets (riadok[k++] , 256, rFile) != NULL );
     fclose (rFile);
   }

   for( j = 0; j < k-1; j++ ) {
     printf("%d. ", j);
     puts( riadok[j] );
   }
   
   token[a] = strtok(riadok[a], " ");
   while( token[a] != NULL )
   { 
      a++;
      token[a] = strtok(NULL, " ");
   }
   
   system("PAUSE");
   return 0;
}


_________________
Notebook: Dell Inspiron 15-7537= i5-4200U|nVidia GT 750M 2GB|RAM 6GB|250GB Samsung 850 EVO|W8.1|Cooler Master NotePal U3
Pc: Asus Rog Strix B360-G | i7-8700 | MSI 1080 Gaming X | Crucial Ballistix 16GB 2666MHz Dual Ranked | Samsung 970 Evo | Crucial MX500 | WD Red | Fera 3 | Arctic F12 Silent | Seasonic Focus Plus 650W Gold | Fractal Design Mini C TG
Disk: Western Digital Elements 1TB USB 2.0; Seagate Expansion 2TB USB 3.0
Príslušenstvo: A4tech Bloody V3 V-Track Core 3 + A4tech Bloody B-070; A4tech Bloody B120; A4tech Bloody G501; ATH-M40x; MSI Clutch M40
Monitor: Dell U2515H
Mobil: Xiaomi Redmi Note 3 Special Edition
Offline

Skúsený užívateľ
Skúsený užívateľ
Obrázok užívateľa

Registrovaný: 17.07.11
Prihlásený: 29.12.20
Príspevky: 1516
Témy: 3 | 3
NapísalOffline : 01.11.2013 20:48 | Načítanie zo súbora

Veď dávaj si kus pozor na to indexovanie. Máš v ňom bordel. Uvedom si čo indexuješ čím.
Inak to robí presne to, čo chceš. Len si v tom musíš ešte utobiť nejaký systém a uložiť všetko, čo potrebuješ. Už vieš ako.


_________________
Na súkromné správy týkajúce sa problémov, ktoré sa riešia vo fóre, neodpovedám!
Offline

Užívateľ
Užívateľ
Načítanie zo súbora

Registrovaný: 07.04.12
Prihlásený: 02.06.21
Príspevky: 907
Témy: 54 | 54
Napísal autor témyOffline : 01.11.2013 21:24 | Načítanie zo súbora

Vlastne áno, tamto funguje pre 1. riadok, takže v token[0]=9 a token[1]=66, len neviem ako to "zopakovať" pre každý riadok
Nejaké 2 upozornenia:
24 [Warning] assignment makes pointer from integer without a cast --> token[a] = strtok(riadok[a], " ");
28 [Warning] assignment makes pointer from integer without a cast --> token[a] = strtok(NULL, " ");

A ako píšeš, mám v tom už asi pekný bordel..


_________________
Notebook: Dell Inspiron 15-7537= i5-4200U|nVidia GT 750M 2GB|RAM 6GB|250GB Samsung 850 EVO|W8.1|Cooler Master NotePal U3
Pc: Asus Rog Strix B360-G | i7-8700 | MSI 1080 Gaming X | Crucial Ballistix 16GB 2666MHz Dual Ranked | Samsung 970 Evo | Crucial MX500 | WD Red | Fera 3 | Arctic F12 Silent | Seasonic Focus Plus 650W Gold | Fractal Design Mini C TG
Disk: Western Digital Elements 1TB USB 2.0; Seagate Expansion 2TB USB 3.0
Príslušenstvo: A4tech Bloody V3 V-Track Core 3 + A4tech Bloody B-070; A4tech Bloody B120; A4tech Bloody G501; ATH-M40x; MSI Clutch M40
Monitor: Dell U2515H
Mobil: Xiaomi Redmi Note 3 Special Edition
Offline

Skúsený užívateľ
Skúsený užívateľ
Obrázok užívateľa

Registrovaný: 17.07.11
Prihlásený: 29.12.20
Príspevky: 1516
Témy: 3 | 3
NapísalOffline : 01.11.2013 21:34 | Načítanie zo súbora

Každé pole si predsa musíš indexovať samostatne. Ak chceš 1.,2.,3. token z prvého riadku, tak musíš urobiť niečo ako token[0] = strtok(riadok[0]...); token[1] = strtok(riadok[0]...); token[2] = strtok(riadok[0]...);
Nemôžeš preto všetko indexovať jednou premennou (a)
A ak chceš uložiť tokeny pre každý riadok, tak aj to musíš mať v dvojrozmernom poli (pole tokenov pre každý riadok)


_________________
Na súkromné správy týkajúce sa problémov, ktoré sa riešia vo fóre, neodpovedám!
 [ Príspevkov: 31 ] 1, 2


Načítanie zo súbora



Podobné témy

 Témy  Odpovede  Zobrazenia  Posledný príspevok 
V tomto fóre nie sú ďalšie neprečítané témy.

Nacitanie obsahu PHP subora na serveri

v PHP, ASP

4

457

25.12.2010 23:44

Blackshadow

V tomto fóre nie sú ďalšie neprečítané témy.

zistenie nazvu php subora

v PHP, ASP

3

427

12.03.2008 15:52

stenley

V tomto fóre nie sú ďalšie neprečítané témy.

Zmena datumu ulozenia subora. ALE!

v Ostatné programy

10

577

12.05.2010 19:12

vama

V tomto fóre nie sú ďalšie neprečítané témy.

Vyhľadávanie podľa obsahu súbora vo Windows 7.

v Operačné systémy Microsoft

0

362

13.07.2012 11:36

filip.bielik

V tomto fóre nie sú ďalšie neprečítané témy.

Zistenie veľkosti súbora uloženého na inom serveri

v PHP, ASP

7

667

25.09.2008 9:53

walther

V tomto fóre nie sú ďalšie neprečítané témy.

Nacitanie stranky

v Ostatné

2

670

13.03.2011 21:00

weroro

V tomto fóre nie sú ďalšie neprečítané témy.

Nacitanie obrazkov

v JavaScript, VBScript, Ajax

4

788

25.01.2011 14:31

newboy1

V tomto fóre nie sú ďalšie neprečítané témy.

nacitanie windowsu

v Operačné systémy Microsoft

7

576

20.11.2011 10:31

andrej2321

V tomto fóre nie sú ďalšie neprečítané témy.

Nacitanie obrazkov

v HTML, XHTML, XML, CSS

10

1286

03.01.2010 13:20

xyz

V tomto fóre nie sú ďalšie neprečítané témy.

Načítanie webu

v Ostatné

6

506

21.06.2013 14:35

ofun

V tomto fóre nie sú ďalšie neprečítané témy.

Načítanie obsahu

v HTML, XHTML, XML, CSS

11

809

12.12.2010 15:40

evryl

V tomto fóre nie sú ďalšie neprečítané témy.

Nacitanie stranky

v PHP, ASP

0

995

09.04.2006 21:44

wolf14

V tomto fóre nie sú ďalšie neprečítané témy.

Nacitanie BIOSu

v AMD čipové sady

11

886

05.12.2015 12:09

filip987

V tomto fóre nie sú ďalšie neprečítané témy.

Nacitanie suboru

v Assembler, C, C++, Pascal, Java

5

614

23.08.2014 21:35

nasm

V tomto fóre nie sú ďalšie neprečítané témy.

nacitanie profilu

v Notebooky a netbooky

1

1194

20.01.2011 19:29

majky358

V tomto fóre nie sú ďalšie neprečítané témy.

C++ nacitanie

v Assembler, C, C++, Pascal, Java

6

948

10.01.2010 10:24

ado21



© 2005 - 2024 PCforum, edited by JanoF