Povolení %n pro zápis do .txt – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Povolení %n pro zápis do .txt – C / C++ – Fórum – Programujte.comPovolení %n pro zápis do .txt – C / C++ – Fórum – Programujte.com

 

Josef Dvořák
~ Anonymní uživatel
3 příspěvky
26. 9. 2018   #1
-
0
-

Ahoj, mám problém se zápisem %n do textového souboru který funguje jako záznam z globálního chatu.

Mám tuto funkci která zajistí vytvoření souboru a následný zápis.

void LogPost(const char* format, ...) {
	_set_printf_count_output(1);
	va_list args;
	va_start(args, format);
	char msg[2048];
	SYSTEMTIME now;
	GetLocalTime(&now);
	char logString[512];
	wsprintf(logString, "LOG_POST\\%02d%02d%02d_POST.txt", now.wYear, now.wMonth, now.wDay);
	memset(msg, 0, sizeof(msg));
	FILE *logfile = fopen(logString, "a+");

	if (logfile)
	{
		_vsnprintf(msg, sizeof(msg), format, args);
		printf("%s", msg);
		fputs(msg, logfile);
		fclose(logfile);
	}
}

Bohužel, po odeslání zprávy která obsahuje %n, program spadne s hláškou "expression ( 'n' format specifier disabled 0)".

Nevíte někdo jak by se tento problém dal vyřešit?

Předem děkuji za odpovědi.

Nahlásit jako SPAM
IP: 85.163.83.–
gna
~ Anonymní uživatel
1891 příspěvků
26. 9. 2018   #2
-
0
-

Tak to tu funkci asi používáš blbě.

LogPost("%s", zprava);
Nahlásit jako SPAM
IP: 213.211.51.–
KIIV
~ Moderátor
+43
God of flame
26. 9. 2018   #3
-
0
-

Ono zalezi na tom, co si od %n slibujes. Pokud si to pletes s \n, tak je odpoved jasna. Pokud chces opravdu jen vypsat %n, tak musis zdvojit %%n (%% ve formatovacim retezci tiskne %).

Pak teda jeste ve formatovacich retezcich existuje %n, ktere nic netiskne, ale zapise do predane adresy na int pocet doposud uspesne vytisknutych parametru. Pak by to bylo potreba bud povolit, nebo zmenit kompilator, pokud to ten tvuj neumi. Ale beztak myslim, ze tohle neni to co chces.

Nahlásit jako SPAM
IP: 89.24.63.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Josef Dvořák
~ Anonymní uživatel
3 příspěvky
26. 9. 2018   #4
-
0
-

KIV děkuji, tato odpověď je asi to co jsem potřeboval.

To co musím udělat je prohledat řetězec msg, ještě než ho předám do funkce a nahradit % -> %%.

Poté by mělo být vše v pořádku.

Tedy pokud se nepletu.

Nahlásit jako SPAM
IP: 85.163.83.–
Josef Dvořák
~ Anonymní uživatel
3 příspěvky
26. 9. 2018   #5
-
0
-

gna : tak tohle je opravdu jednoduchá oprava a děkuji ti za ni.

opravdu pokud zavolám funkci takto:

sprintf(Post, "%s: [POST]%s", Character, msg);
LogPost(Post);

%n to prostě nevezme ale...

LogPost("%s: [POST]%s", Character, msg);

vezme %n úplně v pohodě.

Děkuji, můžete uzavřít toto téma.

Nahlásit jako SPAM
IP: 85.163.83.–
MilanL+1
Grafoman
26. 9. 2018   #6
-
0
-

#5 Josef Dvořák
no ono to vychází v podstatě z konstrukce volání funkce a jejích argumentů.

V tom prvním případě ti to bere celý ten Post včetně Characteru a zprávy jako formátovací řetězec, % ve formatu uvozuje obvykle typ argumentu a %n mezi těmi typy nejspíš není.

Pokud bys to tak chtěl použít musel bys do Postu dát nějaký oddělovače a ve funkci ho rozparsovat,

Ve své podstatě ta funkce není schopná z toho 1 řetězce poznat, která část je formát, která charakter a zpráva.

EDIT:

Pokud jsi to chtěl poslat jako pole argumentů tak na to bys musel použít drobátko jiný zápis.

nebo v tom prvním případě zapisovat do logfile přímo Post bez dalších argumentů tzn

    fputs(format, logfile);

a pak můžeš z funkce vyházet vše s msg a args

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

Podobná vlákna

Zapis a cteni v TxT — založil Mudraon

RFID zápis do Excelu či .txt — založil Thomas125

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ý