Načtení textu z texťáku a přeházení vět (popřípadě slov) – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Načtení textu z texťáku a přeházení vět (popřípadě slov) – C / C++ – Fórum – Programujte.comNačtení textu z texťáku a přeházení vět (popřípadě slov) – C / C++ – Fórum – Programujte.com

 

Milan
~ Anonymní uživatel
282 příspěvků
13. 3. 2013   #1
-
0
-

Ahoj, vedel by nekdo jak udelat tento program v Cčku? Má jít o program, který z texťáku načte text a vety z tohoto textu program nejak prehaze.

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

tak zacni rozepisovat tvoje myslenkovy pochody... co potrebujes abys dosahl toho co potrebujes a tak (zatim staci uplne ze zacatku)

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Milan
~ Anonymní uživatel
282 příspěvků
13. 3. 2013   #3
-
0
-

#2 KIIV
Praveze moc nevim jak na to. Tak na zacatek si asi vytvorim textovy soubor, kde napisu text a ulozim ho. Nebo by to asi slo napsat aj primo do programu aby me to vyzvalo k zapisu nejakyho textu, ja bych ho zapsal a ono by ten textak to vytvorilo. Ale staci kdyz ten textak vytvorim manualne. No a potom nejak prijit na to, jak udelat to, aby se prehazely ty vety nejak :(

Tady mam cteni ze souboru, ale nefunguje mi to :(

#include <stdio.h>
#include <stdlib.h>

FILE *soubor;
char jmeno[100];


void cteniZeSouboru()
{
  soubor = fopen("data.txt", "r");
  while(!(feof(soubor))) {
    fscanf(soubor, "%s", &jmeno);
    printf("%s\n", jmeno);
  }
  fclose(soubor);
}

 
  system("PAUSE");  
  return 0;
}

Nahlásit jako SPAM
IP: 213.192.8.–
Martin Kozibrátka0
Stálý člen
13. 3. 2013   #4
-
0
-

Nech se inspirovat http://www.daniweb.com/software-development/cpp/threads/74451/reading-in-a-random-line-from-a-file

Nahlásit jako SPAM
IP: 188.120.221.–
Savana.cz - neomezený webhosting za pár kaček :)
Milan
~ Anonymní uživatel
282 příspěvků
13. 3. 2013   #5
-
0
-

#2 K#4 Martin Kozibrátka

Zatím mi to nepomohlo :(

Nahlásit jako SPAM
IP: 213.192.8.–
crazy
~ Moderátor
+10
Grafoman
13. 3. 2013   #6
-
0
-

#5 Milan
když napíšeš konkrétní problém, tak ti samozřejmě rádi pomůžeme...

Nahlásit jako SPAM
IP: 147.32.31.–
All you need is vision and time.
Milan
~ Anonymní uživatel
282 příspěvků
13. 3. 2013   #7
-
0
-

#6 crazy

bohuzel moji znalosti z programovani v C nejsou velike a tak bych potreboval program, který nacte text z textoveho souboru, ktery si pred tim napisu. Tento text tedy program nacte a prehaze nejak jednotlive vety nahodne.

Nahlásit jako SPAM
IP: 213.192.8.–
Milan
~ Anonymní uživatel
282 příspěvků
13. 3. 2013   #8
-
0
-

#7 Milan

Nevim jak a co mam vbc pouzit, abych tento problem dokazal vyresit :(

Nahlásit jako SPAM
IP: 213.192.8.–
Milan
~ Anonymní uživatel
282 příspěvků
13. 3. 2013   #9
-
0
-

Tady je program, ktery pri spusteni vyzaduje zapsani textu do 100 znaku. Tento text se prevede na VELKA PISMENA a ulozi se jak zadany text, tak i upraveny text na VELKA pismena. Dalo by se to nejak upravit na to, aby pri zadani textu to prohodilo ty vety nebo slova nejak ? Dekuji za veskere napady a pripominky ;)

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int main()
{
char text[100], znak;
FILE *fMala, *fVelka;

printf("Zadejte text do delky 100 pismen: ");
gets(text);
fMala = fopen("data.txt", "w");
fputs(text, fMala);
fclose(fMala);
printf("\nNyni se podivejte do slozky se souborem data.txt\n");
fMala = fopen("data.txt", "r");
fVelka = fopen("VELKE.txt", "w");

while ((znak = fgetc(fMala)) != EOF)
{
  if((znak >= 'a') && (znak <= 'z'))
  {
   znak -= 32;
   putchar(znak);
   fputc(znak, fVelka);
  }
  else
  {
   putchar(znak);
   fputc(znak, fVelka);
  }
}

fclose(fMala);
fclose(fVelka);
printf("\n");

return 0;
}

Nahlásit jako SPAM
IP: 213.192.8.–
13. 3. 2013   #10
-
0
-

zkus si představit, jak to uděláš "ručně". Pak to rozděl na dílčí úlohy, např. otevřít soubor, přečíst z něj větu (čím končí věta?), nahodile vybrat uloženou větu a vypsat ji.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
Milan
~ Anonymní uživatel
282 příspěvků
13. 3. 2013   #11
-
0
-

#10 hlucheucho
No jasne, ale co mam pouzit za funkci aby mi to ty vety nejak prehazelo ? Myslis ze by slo osetrit useky, ktere zacinaji velkym pismenem a konci texkou ? Napr.: kdyz tam budu mit treba 5 vet tak se to rozdeli na 5 useku a tyto useky se nahodne preskupi treba do druheho textaku ? nebo jen vypisou, to je jedno. 

Nahlásit jako SPAM
IP: 213.192.8.–
13. 3. 2013   #12
-
0
-

mám pole řetězců - zatím prázdný. Otevřu vstupní soubor (fopen) pro čtení, čtu ho po znacích (fgetc), ukládám do řetězce a testuji, zda je to ? ! nebo .(if). Pokud ano, jedná se o konec věty (pominu zkratky ukončené tečkou), na konec řetězce jako jeho poslední znak uložím 0x00 a přesunu se na další řetězec. Mezeru ignoruji (oět if) a čtu až další znak. Toto opakuji až po konec souboru (končí znakem EOF). Mám pole přečtených řetězců = vět. Zavřu vst. soubor (fclose). Otevřu výst soubor (zase fopen). Generátorem náhodných čísel vyberu jednotlivé položky tak, aby se neopakovaly (to tu nedávno někde bylo) a celé řetězce ukládám do souboru (asi fprintf). Po skončení práce výst. soubor zavřu.

Výpis na obrazovku jde udělat pomocí printf.

Když vypustíš jména funkcí v závorkách máš obecný algoritmus bez ohledu na programovací jazyk, ve kterém dojde k implementaci algoritmu. V závorkách máš funkce z jazyka C, pro jejich použití musíš použít #include <stdio.h>

hu

Nahlásit jako SPAM
IP: 188.95.60.–
13. 3. 2013   #13
-
0
-

začni se statickým polem s tím, že věta bude omezena na max 64 znaků a celý soubor na max 10 vět. Až to rozchodíš, začni bádat na dynamickou alokací řetězců pro uložení vět. Postup od jednoduššího ke složitějšímu.

Je ještě alternativní postup: uložím soubor jako blok dat do bufferu - také po znacích a současně si zapamatuju ukazatel na místa, kde začínají věty - v tomto případě mám pole ukazatelů. Pak generuji nahodile indexy a pomocí takto vybraných ukazatelů přečtu věty a uložím do výst souboru.

Třetí možnost je projet soubor, zapamatovat si, kde v něm začínají jednotlivé věty a jejich délku a nahodile vybírat věty a kopírovat ze souboru do souboru. Soubor musí být otevřen jako binární. Asi menší nároky na paměť, ale asi to bude pomalé.

hu

Nahlásit jako SPAM
IP: 188.95.60.–
Milan
~ Anonymní uživatel
282 příspěvků
13. 3. 2013   #14
-
0
-

#13 hlucheucho
Mám zatím tohle: Nevím si rady s tim retezcem atd. :( Muzes to zkouknout a poradit prosim ? Mám to trochu jinak ten program, ze se me zepta co tam chcu napsat a potom to ulozi do souboru data.txt a potom z tohoto souboru to znak po znaku kontrolu zda tam neni .,? nebo !. jak to ale ukladat do pole nevim a jak prehazovat ty vety take ne.

// dalsi pokus.cpp : Defines the entry point for the console application.
//
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int main()
{
char text[100], znak;
FILE *fvstup, *fvystup;

printf("Zadejte text do delky 100 pismen: ");
gets(text);
fvstup = fopen("data.txt", "w");
fputs(text, fvstup);
fclose(fvstup);
printf("\nNyni se podivejte do slozky se souborem data.txt\n");
fvstup = fopen("data.txt", "r");
fvystup = fopen("vystup.txt", "w");

while(znak = fgetc(fvstup) != EOF)
{
  if((znak = '.') && (znak = '?') && (znak = '!'))
  {
   znak -= 32;
   putchar(znak);
   fputc(znak, fvystup);
  }
  else
  {
   putchar(znak);
   fputc(znak, fvystup);
  }
}

fclose(fvstup);
fclose(fvystup);
printf("\n");

return 0;
}

Nahlásit jako SPAM
IP: 213.192.8.–
14. 3. 2013   #15
-
0
-

Testovací textový soubor si můžeš napsat třeba v Notepadu. Takhle by vypadala funkce, která přečte větu ze souboru (nástřel, není to odladěné):

int CtiVetu(FILE *odkud, char *kam)
{
	char znak;
	int stav = 0;
	int i = 0;

	do  {       //cte po znacich dokud neni konec vety nebo souboru
      znak = fgetc(odkud);
	  switch (znak) {

		case EOF:  //konec souboru
		  stav = -1;
		break;

		case '.':  //veta ukoncena teckou
		case '?':  //veta ukoncena otaznikem
		case '!':  //veta ukoncena vykricnikem
		  stav = 1;
		  kam[i] = znak;
		  i++;
		break

		case ' ':  //mezera se pred vetou ignoruje, ve vete musi zustat
		  if (stav == 0) {
			kam[i] = znak;
			i++;
		  }
		break;

		default:   //jakykoliv jiny znak
		  stav = 0;
		  kam[i] = znak;
		  i++;
		;
	  }
	} while (0 == stav);
	kam[i] = 0;
	return stav; //vraci -1 pro vetu ukoncenou EOF
}

a její použití:

Nahlásit jako SPAM
IP: 195.178.67.–
14. 3. 2013   #16
-
0
-

   

	char veta[128];
	FILE *fin;           //soubor ze ktereho ctes vety

	fin = fopen("soubor.txt", "rb");
	if (fin == NULL) {
	   //nejde otevrit soubor
	}
	else
	{
		//soubor otevren
		CtiVetu(fin, veta);
		fclose(fin);
    }

asi by to šlo snadno upravit na čtení souboru do bufferu a pamatování si ukazatelů na začátky vět.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
Milan
~ Anonymní uživatel
282 příspěvků
14. 3. 2013   #17
-
0
-

Promin, asi jsem nejakej natvrdlej nebo neco, snazil jsem se to dat dohromady, ale hlava mi to nejak nebere. Myslis kompletni program by mel vypadat takhle ? Asi je mozny ze tam neco posprehazeny nebo tak neco, nebo nevim kam to vlozit, asi tam ma byt jeste int main () nebo ne a misto toho je tam int int CtiVetu(FILE *odkud, char *kam) ? to je asi blbost že ? A jestli to teda spravne chapu tak soubor.txt je soubor pro cteni tech vet, takze ho hodim do slozky s programem a hodim tam napr.: 5 vet a z tohoto to bude cist ? No a pak potrebuju jeste nekam to ukladat a prehazet nejak ze ? Uz jsem z toho nejaky zmateny, promin :(

#include "stdafx.h"
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>

int CtiVetu(FILE *odkud, char *kam)

{
char veta[128];
FILE *fin;           //soubor ze ktereho ctes vety

fin = fopen("soubor.txt", "rb");
if (fin == NULL) {
    //nejde otevrit soubor
}
else
{
  //soubor otevren
  CtiVetu(fin, veta);
  fclose(fin);
   
}
char znak;
int stav = 0;
int i = 0;

do  {       //cte po znacich dokud neni konec vety nebo souboru
      znak = fgetc(odkud);
   switch (znak) {

  case EOF:  //konec souboru
    stav = -1;
  break;

  case '.':  //veta ukoncena teckou
  case '?':  //veta ukoncena otaznikem
  case '!':  //veta ukoncena vykricnikem
    stav = 1;
    kam[i] = znak;
    i++;
  break;

  case ' ':  //mezera se pred vetou ignoruje, ve vete musi zustat
    if (stav == 0) {
   kam[i] = znak;
   i++;
    }
  break;

  default:   //jakykoliv jiny znak
    stav = 0;
    kam[i] = znak;
    i++;
  ;
   }
} while (0 == stav);
kam[i] = 0;
return stav; //vraci -1 pro vetu ukoncenou EOF


}

Nahlásit jako SPAM
IP: 213.192.8.–
Milan
~ Anonymní uživatel
282 příspěvků
14. 3. 2013   #18
-
0
-

#16 hlucheucho

jo a nemelo by tam byt misto : 

fin = fopen("soubor.txt", "rb");

fin = fopen("soubor.txt", "r"); ?

Nahlásit jako SPAM
IP: 213.192.8.–
19. 3. 2013   #19
-
0
-

znovu a znovu:

1. podrobně popiš, co chceš udělat
2. rozděl to na dílčí úkoly
3. implementuj dílčí úlohy
4. použij implementaci dílčích úloh jako stavební kameny celého řešení

Kód, který jsem ti sem dal, je ukázkou, jak číst větu ze souboru a uložit do řetězce. Má to omezení - nehlídají se meze pole, tím je omezena délka čtené věty, což s "dobře" připraveným souborem bude fungovat. Místo "soubor.txt" je vhodnější použít full path souboru. Číst věty do řetězců je v podstatě (když pro uložení použiju pole řetězců, což lze pro začátek implementovat jako 2-rozměrné pole):

1. Přečti větu do prvního řetězce
2. Přečti další větu do dalšího řetězce

atd až do přečtení celého souboru.

Obsah testovacího souboru by mohl vypadat třeba takto:

První věta. Co bude druhá věta? Napiš třetí větu! Čtvrtá věta je poslední.

Pozn.: záměrně nepředkládám použití dynamicky alokovaných polí pro ukládání vět. 

hu

Nahlásit jako SPAM
IP: 195.178.67.–
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, 39 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ý