Parsování řádku – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Parsování řádku – C / C++ – Fórum – Programujte.comParsování řádku – C / C++ – Fórum – Programujte.com

 
Hledat
Moderní platforma pro vytvoření vašeho nového webu – Wix.com.
Nyní už můžete mít web zdarma.
Vytvořte si vlastní webové stránky. Snadno, rychle a levně přes Saywebpage.com
Vybavení pro Laser Game
Spuštěn Filmový magazín
Laser Game Brno
Laser Game Ostrava

Adela123
~ Anonymní uživatel
7 příspěvků
1. 2. 2020   #1
-
0
-

   


#include "stdafx.h"
#include <string>

using namespace std;
char obsah[200];
char cisla[20];
struct TCislo{
int cislo;
};
struct TVety{
char vety[200];
};
void Parsovanivet( char *obsah,char *text){
strcpy(text, strtok(obsah, "."));
obsah=0;
text=0;
}
void VetyTXT(TVety Souhrn[],int &PocetVet){
char text[200];
int j=0;
FILE * soubor;
soubor=fopen("vety.txt","rt");
while(!feof(soubor)){
fgets(obsah,200,soubor); 
Parsovanivet(obsah,text);
strcpy(Souhrn[j].vety,obsah);
j++;
}
PocetVet=j;
}
void Parsovani(char *cisla, int &cislo){
cislo=atoi(strtok(cisla,";"));
cisla=0;
}
void CislaTXT(TCislo Prehled[],int &PocetCisel,int &cislo){
int i=0;
FILE * soubor1;
soubor1=fopen("cisla.txt","rt");
while(!feof(soubor1)){
fgets(cisla,20,soubor1);
Parsovani(cisla,cislo);
Prehled[i].cislo=cislo;
i++;
}
PocetCisel=i;
}
void Prehazeni(TCislo Prehled[],TVety Souhrn[],int PocetCisel, int PocetVet){
for (int i = 0; i<PocetCisel;i++ ){
for (int j = 0; j<PocetVet;j++ ){
if(Prehled[i].cislo==j)
printf("%s\n",Souhrn[j].vety);
}
}
}
int _tmain(int argc, _TCHAR* argv[])
{
TCislo Prehled[20];
TVety Souhrn[200];
int PocetCisel=0;
int cislo=0;
int PocetVet=0;
VetyTXT(Souhrn,PocetVet);
CislaTXT(Prehled,PocetCisel,cislo);
Prehazeni(Prehled,Souhrn,PocetCisel,PocetVet);
return 0;
}


Dobrý den, 

chtěla by se zeptat programuji v C++, ale nevím jak udělat to ,aby se mi rozparsoval v txt jeden řádek s čísly, protože teď to funguje jen tak, že každé číslo musím mít na jednom řádku. 

Popřípadě moc děkuji za rady, 

Adela

Nahlásit jako SPAM
IP: 160.216.152.–
1. 2. 2020   #2
-
0
-

Dělit řetězec podle oddělovače (mezera? středník?)

hu

Nahlásit jako SPAM
IP: 2001:af0:ffe4:85f4:959c:c828:c1d4:ba59...–
Adela123
~ Anonymní uživatel
7 příspěvků
1. 2. 2020   #3
-
0
-

#2 hlucheucho 

void Parsovani(char *cisla, int &cislo){
cislo=atoi(strtok(cisla,";"));
cisla=0;
}

Dělím to podle středníku, ale bohužel vždy to najde jen jedno číslo na řádku. Když to mám rozdělené, že každé číslo má svůj řádek je to v pořádku, ale já bych ty čísla potřebovala na jednom a to je s tímto kódem problém.

Nahlásit jako SPAM
IP: 160.216.152.–
KIIV
~ Moderátor
+43
God of flame
2. 2. 2020   #4
-
0
-

 Ja bych se s tim moc neparal...

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

using std::vector;
using std::string;

vector<int> parseLine(std::istream & input)
{
	string line;
	if (!std::getline(input, line)) return{};

	for (auto & chr : line)
	{
		if (chr == ';') chr = ' ';
	}

	std::istringstream inputline{ line };
	std::vector<int> result;

	std::copy(std::istream_iterator<int>(inputline), std::istream_iterator<int>(), std::back_insert_iterator<std::vector<int>>(result));

	return result;
}



int main()
{
	std::istringstream data{ "47;58;568; ;;687;1245\n1;4;8;6;3;2;" };

	while (data)
	{
		auto nums = parseLine(data);

		if (nums.empty()) break;

		std::copy(nums.begin(), nums.end(), std::ostream_iterator<int>(std::cout, " - "));
		std::cout << "\n";
	}


    return 0;
}

Pokud potrebujes ze souboru, tak staci otevrit pomoci:  std::ifstream data{ "x.txt" }; misto toho istringstreamu

Kontroly tam moc nejsou, jak to narazi na prazdnej radek, tak to skonci.. To same, pokud se soubor nepodarilo otevrit.

Pouzivam tam standardni C++ libky a algoritmy, zadne smeti z C (kteremu by ses mel idealne uplne vyhybat). Precijen, kazda vec, kterou napises, muze a pravdepodobne bude obsahovat chyby. Zatimco algoritmy jsou pomerne slusne otestovane obrovskou komunutou lidi...

Nahlásit jako SPAM
IP: 37.48.58.–
Program vždy dělá to co naprogramujete, ne to co chcete...
gna
~ Anonymní uživatel
1173 příspěvků
2. 2. 2020   #5
-
0
-

#1 Adela123
Máš to tady správně vložené jako kód a přesto tam není žádne odsazení. To jsi odněkud zkopíroval(a), že?

Tak když aspoň víš, kde je problém, tak to prostě uprav na dvě čísla. 

void Parsovani(char *cisla, int &cislo1, int &cislo2){
	char *prvni = strtok(cisla, ";");
	char *druhe = strtok(NULL, ";");
	cislo1 = atoi(prvni);
	cislo2 = atoi(druhe);
}

A když už je to C++, tak trochu nevidím důvod to celé matlat v C.

Nahlásit jako SPAM
IP: 213.211.51.–
Adela123
~ Anonymní uživatel
7 příspěvků
2. 2. 2020   #6
-
0
-

#4 KIIV
Moc děkuji za pomoc, vím,že to asi není ideální styl programování, ale pro mě je to přehlednější a jsem ještě na začátku, tak se snažím pracovat s tím co umím.

Nahlásit jako SPAM
IP: 160.216.152.–
Adela123
~ Anonymní uživatel
7 příspěvků
2. 2. 2020   #7
-
0
-

#5 gna

Ze začátku děkuji za radu!

Ale ne, nezkopírovala jsem to. Jenže upravení na 2 čísla není řešení, co kdyby tam těch čísel bylo třeba 1000. Samozřejmě, že tam můžu dát tisíc čísel, ale to tam pak nemusím mít tu strukturu a musela bych ten program napsat úplně jinak a otrocky to psát nechci, když by stačil např. jeden cyklus.

Nahlásit jako SPAM
IP: 160.216.152.–
gna
~ Anonymní uživatel
1173 příspěvků
3. 2. 2020   #8
-
0
-

#7 Adela123
Správně, šlo by to hodit do cyklu. Už jich tam několik máš, tak víš, jak fungují. V čem je problém?

Nahlásit jako SPAM
IP: 213.211.51.–
KIIV
~ Moderátor
+43
God of flame
3. 2. 2020   #9
-
+1
-
Zajímavé

#6 Adela123
No ten ciste C++ styl vypada ze zacatku trochu necitelne, ale ma to svoje kouzlo. Misto copy se to da prochazet tim for eachem a tak.

Jednoduse tam nactu cely radek do stringu, prepisu vsechny stredniky na mezery, aby se to dalo predhodit istringstreamu a nechat to zpracovat v nem, a pak uz jen pouziju par vychytavek at to nemusim nacitat rucne. 

std::copy(std::istream_iterator<int>(inputline), std::istream_iterator<int>(), std::back_insert_iterator<std::vector<int>>(result));

vlastne udela to same jako:

do
{
  int cislo;
  if (inputline >> cislo) // nacti jedno cislo
  {                       // (to nacteni vrati referenci na inputline a da se pak tedy testovat,
                          // jestli neco neselhalo - pomoci implicitniho pretypovani na boolean, ktere ma naimplementovane)
    result.push_back(cislo);  // vloz ho na konec vectoru
  }  
}
while (inputline); // otestujeme zda neco neselhalo a kdyztak skoncime nacitani

Akorat v tom druhem je vetsi sance udelat nejakou chybu

Nahlásit jako SPAM
IP: 37.48.58.–
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, 51 hostů

Podobná vlákna

Parsování textu — založil oxidián

Parsování textu — založil chrris

Parsování xml — založil Paja2

Parsování do pole — založil georginho

Parsování stringu v C++ — založil jirkab

Moderátoři diskuze

 

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