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

Načtení čísel z textového souboru do pole – C / C++ – Fórum – Programujte.comNačtení čísel z textového souboru do pole – C / C++ – Fórum – Programujte.com

 

Metodej0
Duch
18. 8. 2015   #1
-
0
-

V C++ jsem zatím nováček a potřeboval bych přečíst čísla (celá i desetinná) z textového souboru (pevný počet sloupců, proměnlivý počet řádků), uložit je do dvourozměrného pole (pokud není lepší možnost) a pak vypsat řádky, které splňují dané podmínky. Ztroskotal jsem ale už na načtení čísel do pole, když ho pak vypíšu, tak je prázdné (+ vypisuje se mi jen jeden řádek). Poradili byste mi prosím, kde mám chybu:

	int z, pocet=1,i,j;
	float x;
	FILE *soubor;
	soubor=fopen("soubor.txt", "r+");
	while ((z=getc(soubor)) != EOF)
		if (z=='\n') pocet++;
	cout << pocet;
	
	float pole[pocet][24];	
	for(i=0;i<=pocet;i++){
	for(j=0;j<=24;j++){
	pole[i][j]=0;
    }}
	for(i=0;i<=pocet;i++){
	for(j=0;j<=24;j++){
	fscanf(soubor, "%f",&x);
	pole[i][j]=x;
    }}
    	for(i=0;i<=pocet;i++){	
	for(j=0;j<24;j++){
	x=pole[i][j];
	fprintf(soubor,"%f \t",pole[i][j]);
    }}
Nahlásit jako SPAM
IP: 81.200.57.–
Kit+15
Guru
18. 8. 2015   #2
-
0
-

#1 Metodej
Nejprve zkus místo všech "<=" použít "<". Tak jak to máš, lezeš mimo hranice pole.

Pokud nějaké pole plníš nějakými daty, nemusíš ho nulovat. Není to však chyba.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
KIIV
~ Moderátor
+43
God of flame
18. 8. 2015   #3
-
+2
-
Zajímavé

Nebude to tim, ze nejprve spocitas radky, ale uz se nevratis na zacatek souboru?

+ pole[pocet][24]  je blbej napad.

Taky bys mohl pouzivat ifstream, kdyz ses v C++.

Je jiste, ze mas vzdy 24 cisel na radku? Jinak se ti to mirne receno rozhodi.

Nahlásit jako SPAM
IP: 94.113.92.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Metodej0
Duch
18. 8. 2015   #4
-
0
-

Děkuji, s ifstream už to funguje.

Proč je pole[pocet][24] blbej nápad? Pomůže definovat předtím jinou konstantu o velikosti počtu řádků? Nebo to jde vyřešit i nějak jinak?

Nahlásit jako SPAM
IP: 81.200.57.–
KIIV
~ Moderátor
+43
God of flame
18. 8. 2015   #5
-
+1
-
Zajímavé

no jde to vyresit i jinak (pouzivam nektere veci ze -std=c++11 ale kdyz by se jich zbavilo, tak to pujde i bez toho), kazdopadne to zvladne libovolne mnozstvi cisel na radku a libovolny pocet radku (co se vejde do ram):

#include <iostream>
#include <fstream>
#include <sstream>
#include <iterator>
#include <string>
#include <vector>
#include <algorithm>

int main() {
  std::vector<std::vector<float>>  pole;

  std::ifstream soubor{"soubor.txt"}; // otevreme soubor
  while (soubor) { // soubor se da testovat jako boolean - vraci true dokud neni eof ci jina chyba
    std::string radek; // pripravime si retezec na ulozeni radku
    std::getline(soubor, radek); // nacteme cely radek

    std::istringstream vstup{radek}; // z radku si udelame vstupni stream (jde pouzivat >> float_val)

    std::vector<float> ln; // pripravime si pomocne pole
    // tady je to uz trosku zajimavejsi:
    std::copy( // copy ocekava iterator na zacatek a konec sekvence, ktera ma byt zkopirovana + zacatek sekvence kam ma byt zkopirovana (musi na to byt misto)
      std::istream_iterator<float>{vstup}, // specialni iterator pro nacitani ze streamu - dereferenci vrati nactenou hodnotu
      std::istream_iterator<float>{},      // a porovnava se s timto. Budou stejne, pokud se nepodarilo nacist dalsi polozku.
      std::back_insert_iterator<std::vector<float>>{ln} // nicmene existence mista lze obejit pomoci dalsiho iteratoru, ktery vlastne znamena:  ln.push_back(*iter)
      );
    if (! ln.empty()) {
      pole.push_back(move(ln)); // pokud se aspon neco nacetlo, muzeme to vlozit do vystupniho pole (move presune vnitrek vectoru bez kopirovani - setri cas) 
    }
  }

  // a letmo vypiseme
  for (auto & ln : pole) {
    for (float x : ln) {
      std::cout << x << ":";
    }
    std::cout << "\n";
  }
}
Nahlásit jako SPAM
IP: 94.113.92.–
Program vždy dělá to co naprogramujete, ne to co chcete...
KIIV
~ Moderátor
+43
God of flame
18. 8. 2015   #6
-
0
-

Jo takhle by to vypadalo bez noveho standardu:

#include <iostream>
#include <fstream>
#include <sstream>
#include <iterator>
#include <string>
#include <vector>
#include <algorithm>

int main() {
  std::vector<std::vector<float> >  pole;

  std::ifstream soubor("soubor.txt"); // otevreme soubor
  while (soubor) { // soubor se da testovat jako boolean - vraci true dokud neni eof ci jina chyba
    std::string radek; // pripravime si retezec na ulozeni radku
    std::getline(soubor, radek); // nacteme cely radek

    std::istringstream vstup(radek); // z radku si udelame vstupni stream (jde pouzivat >> float_val)

    std::vector<float> ln; // pripravime si pomocne pole
    // tady je to uz trosku zajimavejsi:
    std::copy( // copy ocekava iterator na zacatek a konec sekvence, ktera ma byt zkopirovana + zacatek sekvence kam ma byt zkopirovana (musi na to byt misto)
      std::istream_iterator<float>(vstup), // specialni iterator pro nacitani ze streamu - dereferenci vrati nactenou hodnotu
      std::istream_iterator<float>(),      // a porovnava se s timto. Budou stejne, pokud se nepodarilo nacist dalsi polozku.
      std::back_insert_iterator<std::vector<float> >(ln) // nicmene existence mista lze obejit pomoci dalsiho iteratoru, ktery vlastne znamena:  ln.push_back(*iter)
      );
    if (! ln.empty()) {
      pole.push_back(ln); // pokud se aspon neco nacetlo, muzeme to vlozit do vystupniho pole 
    }
  }

  // a letmo vypiseme
  std::vector<std::vector<float> >::iterator  it = pole.begin();
  for (;pole.end() != it; ++it) {
    std::copy(it->begin(), it->end(), std::ostream_iterator<float>(std::cout,":"));
    std::cout << "\n";
  }
}
Nahlásit jako SPAM
IP: 94.113.92.–
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, 18 hostů

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ý