Načtení souboru C – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Načtení souboru C – C / C++ – Fórum – Programujte.comNačtení souboru C – C / C++ – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené.
8. 11. 2014   #1
-
0
-

Dobrý den,

porádí mi někdo(polopaticky), jak načíst ze standartního vstupu soubor(řádky, sloupce, písmenka i čísla) bez použití fopen atd., soubor bude na standartní vstup přesměrován. Potřebuji to pak použít pro výběr jednotlivých sloupců, maximum a další blbosti. Děkuji

Nahlásit jako SPAM
IP: 147.229.93.–
KIIV
~ Moderátor
+43
God of flame
8. 11. 2014   #2
-
+1
-
Zajímavé

funguje to uplne presne stejne jako se souborem.. jen je tam nadefinovanej "soubor" stdin (takze ho uz nemusis otvirat) + taky fungujou funkce jako scanf, gets a takovy, co pracujou rovnou se stdin (ale univerzalnejsi je pouzivat fscanf a fgets a tak dal...

Nahlásit jako SPAM
IP: 93.91.152.–
Program vždy dělá to co naprogramujete, ne to co chcete...
8. 11. 2014   #3
-
0
-

#2 KIIV
Děkuji.

Už to chápu. Lze nějak opravit tento kód, aby to dělalo to stejné, ale s tím že je ten soubor na standartním vstupu a nejlépe to nevyužívalo mallock a NULL? Jsem začátečník, tak pokuď by někdo věděl tak prosím i okomentovat ať to můžu pochopit. Děkuji

  FILE * stdin;
  long lSize;
  size_t result;

  pFile = fopen ( argv[argc-1], "rb" );
  if (pFile==NULL) {fputs ("File error",stderr); exit (1);}

  // obtain file size:
  fseek (pFile , 0 , SEEK_END);
  lSize = ftell (pFile);
  rewind (pFile);

  // allocate memory to contain the whole file:
  buffer = (char*) malloc (sizeof(char)*lSize);
  if (buffer == NULL) {fputs ("Memory error",stderr); exit (2);}

  // copy the file into the buffer:
  result = fread (buffer,1,lSize,pFile);
  if (result != lSize) {fputs ("Reading error",stderr); exit (3);}

  /* the whole file is now loaded in the memory buffer. */

  // terminate
  fclose (pFile);

Nahlásit jako SPAM
IP: 147.229.93.–
vitamin+8
Grafoman
8. 11. 2014   #4
-
0
-

fseek a rewind ti nebudu fungovat so stdin. Takze si musis vstup nacitat do pamete (vyuzit napr malloc :)) alebo si vytvorit pomocny subor...

Nahlásit jako SPAM
IP: 95.105.229.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
KIIV
~ Moderátor
+43
God of flame
8. 11. 2014   #5
-
0
-

Ale taky zalezi co potrebujes delat s tema datama, treba je uplne zbytecny nacitat to cely a stacilo by zpracovabat jen jednotlivy radky

Nahlásit jako SPAM
IP: 93.91.152.–
Program vždy dělá to co naprogramujete, ne to co chcete...
8. 11. 2014   #6
-
0
-

Potřebuji provádět funkce, průměr hodnot z určených sloupců nebo řádků z tabulky co bude na vstupu, minimum, maximum a součet, a výpis vybraných sloupců nebo řádků má to být takový tabulkový kalkulátor.

Nahlásit jako SPAM
IP: 147.229.93.–
KIIV
~ Moderátor
+43
God of flame
8. 11. 2014   #7
-
0
-

to vsechno se da v pohode pocitat prubezne...

Nahlásit jako SPAM
IP: 93.91.152.–
Program vždy dělá to co naprogramujete, ne to co chcete...
8. 11. 2014   #8
-
0
-

#7 KIIV
A jak? Opravdu jsem pouze začátečník. Tady je třeba funkce pro výběř řádků, sloupců, ale nevím jak to udělat pomocí načítání průběžně(chápu lépe na příkladech a podle toho udělám i zbytek). Děkuji za odpověď

void range(const char* table, int a, int b, int x, int y, char* out)
{
    char c;
    char cell[1024] = "";
    int i = 0;
    int incell = 0;
    int cell_end = 0;

    int row = 1;
    int col = 1;

    while(table[i])             // prochazi znaky tabulky
    {
        c = table[i];
        if(!isspace(c))         // pokud není bily znak
        {
            cell[cell_end] = c; // prida znak do stringu bunky
            cell_end++;         // pocet znaku bunky
            incell = 1;         // zda jsme v bunce
        }
        else
        {
            if(incell == 1)     // první bílý znak za bunkou
            {
                if(row >= a && row <= b && col >= x && col <= y)            // je-li bunka v rozsahu
                {
                    cell[cell_end++] = ENDL;    // konec radku na konec bunky
                    cell[cell_end] = '�';      // ukoncit string bunky
                    strcat(out, cell);          // pridat bunku do vystupnich dat
                }

                cell_end = 0;                   // reset poctu znaku bunky
                col++;                          // dalsi sloupec
            }
            if (c == '\n')                      // byl-li bily znak znakem konce radku
            {
                col = 1;                        // zpatky na prvni sloupec
                row++;                          // a na dalsi radek
            }
            incell = 0;                         // a nastavime ze jsme mimo bunku
        }
        i++;                    // na dalsi znak
    }
}

/*

Nahlásit jako SPAM
IP: 147.229.93.–
KIIV
~ Moderátor
+43
God of flame
8. 11. 2014   #9
-
0
-

bez konkretniho zadani je to stejne jen hadani ... jak se urcuje, co se ma udelat ?

Nahlásit jako SPAM
IP: 93.91.152.–
Program vždy dělá to co naprogramujete, ne to co chcete...
8. 11. 2014   #10
-
0
-

#9 KIIV

Určuje se to s argumentů programu při spuštění.

Tady je zadání ve zkratce:

Argumenty programu:

--help způsobí, že program vytiskne nápovědu používání programu a skončí.
operace reprezentuje jednu z následujících operací:

select značí operaci, která z dané tabulky pouze vybere a následně vytiskne hodnoty daných buněk,
min značí vyhledání a následný tisk minimální hodnoty z daného rozsahu buněk,
max značí vyhledání a následný tisk maximální hodnoty z daného rozsahu buněk,
sum značí výpočet a následný tisk sumy hodnot všech vybraných buněk,
avg značí výpočet a následný tisk aritmetického průměru vybraných buněk.

výběr_buněk reprezentuje rozsah tabulky, nad kterým má být provedena daná operace. Rozsah je definován jedním z následujících argumentů:

row X značí výběr všech buněk na řádku X (X > 0),
col X značí výběr všech buněk ve sloupci X (X > 0),
rows X Y značí výběr všech buněk od řádku X (včetně) až po Y (včetně). 0 < X <= Y.
cols X Y značí výběr všech buněk od sloupce X (včetně) až po Y (včetně). 0 < X <= Y.
range A B X Y značí výběr buněk od řádku A po řádek B a od sloupce X po sloupec Y (včetně daných řádků a sloupců). 0 < A <= B, 0 < X <= Y.

Implementační detaily

Program čte zpracovávanou tabulku ze standardního vstupu (stdin). Veškeré informace vypisuje na standardní výstup (stdout). Řádek tabulky je zakončen znakem konce řádku. Sloupce tabulky (resp. buňky na řádku) jsou odděleny jedním a více bílých znaků. Buňka může obsahovat číslo nebo text (bez bílých znaků). Maximální délka jednoho řádku je 1024 znaků.

Operace a jejich výstup

Operace select vypíše seznam hodnot z daného výběru. Každá hodnota bude vypsána na jeden řádek. V případě, že hodnota je číslo, bude vypsáno formátem %.10g funkce printf. V případě, že výběr zahrnuje více řádků či sloupců, hodnoty tabulky budou zpracovávány po řádcích, tj. nejprve všechny hodnoty daného řádku zleva doprava, pak hodnoty následujícího řádku.
Operace min, max, sum a avg pracují pouze nad buňkami obsahující číselné údaje. Funkce vypíší výsledek jako jedno číslo formátu %.10g na samostatný řádek.

Nahlásit jako SPAM
IP: 147.229.93.–
9. 11. 2014   #11
-
0
-

#10 jindra1995
Poradí prosím někdo? Mám už málo času a nemůžu díky tomu v programu pokročit. Děkuji

Nahlásit jako SPAM
IP: 46.167.212.–
KIIV
~ Moderátor
+43
God of flame
9. 11. 2014   #12
-
0
-

#12 jindra1995
by bylo lepsi nacitat celej radek.. kdyz nemuze byt delsi jak 1024, tak to neni takovej problem

char radek[1027]; // \n se tam kopiruje tez (woknouze muzou mit i \r\n), delka radku muze byt 1024 a jeste je potreba misto na \0

if (fgets(radek,1027,stdin) != NULL) {  ...

Nahlásit jako SPAM
IP: 93.91.152.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 112 hostů

Podobná vlákna

Načtení souboru? — založil DjHard

C++ načtení ze souboru — založil james2000

Nacteni ze souboru — založil sedma

Nacteni obsahu souboru — založil nodead

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý