Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria
Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria
vivo X300 Pro rappresenta un'evoluzione misurata della serie fotografica del produttore cinese, con un sistema di fotocamere migliorato, chipset Dimensity 9500 di ultima generazione e l'arrivo dell'interfaccia OriginOS 6 anche sui modelli internazionali. La scelta di limitare la batteria a 5.440mAh nel mercato europeo, rispetto ai 6.510mAh disponibili altrove, fa storcere un po' il naso
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo
Lenovo Legion Go 2 è la nuova handheld PC gaming con processore AMD Ryzen Z2 Extreme (8 core Zen 5/5c, GPU RDNA 3.5 16 CU) e schermo OLED 8,8" 1920x1200 144Hz. È dotata anche di controller rimovibili TrueStrike con joystick Hall effect e una batteria da 74Wh. Rispetto al dispositivo che l'ha preceduta, migliora ergonomia e prestazioni a basse risoluzioni, ma pesa 920g e costa 1.299€ nella configurazione con 32GB RAM/1TB SSD e Z2 Extreme
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti
A re:Invent 2025, AWS mostra un’evoluzione profonda della propria strategia: l’IA diventa una piattaforma di servizi sempre più pronta all’uso, con agenti e modelli preconfigurati che accelerano lo sviluppo, mentre il cloud resta la base imprescindibile per governare dati, complessità e lock-in in uno scenario sempre più orientato all’hybrid cloud
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 22-06-2013, 00:18   #1
vendettaaaaa
Senior Member
 
L'Avatar di vendettaaaaa
 
Iscritto dal: Jan 2012
Messaggi: 1267
[C++] Bug di GCC (o meglio, MinGW)?

Ciao,
ho questo codice:
Codice:
int main(int arcg, char* argv[])
{
	{
		// Open input file stream
		ifstream ifs("Test Element.txt");
		if (!ifs)
			throw runtime_error("Couldn't open the input file!");

		// Find the beginning of the Element Data section
		string line;
		while (getline(ifs, line, '\n'), line != "$* ELEMENT DATA")
		{	
			if (ifs.eof())
			{
				cout << "Cannot find Species Data!!" << endl;
				return 0;
			}
		}
	
		// Save the beginning of the Element Data section
		streampos begin = ifs.tellg();
	}
}
con questo file di testo:
Codice:
!File di prova per testare la routine di gestione degli elementi

$* ELEMENT DATA
C  .1201070000D+02 CO2          CO2          .3700000000D-03
H  .1007940000D+01 H2O          H2O          .0000000000D+00
N  .1400670000D+02 N2           N2           .7809000000D+00
O  .1599940000D+02 O2           O2           .2095000000D+00
$* END OF ELEMENT DATA
Ebbene, se eseguo il tutto in VS 2012, begin ha valore 85, mentre se uso QtCreator con MinGW (4.7, o 4.8, non cambia) ha valore 94, che è ERRATO!
Infatti se poi faccio ifs.seekg(begin) e uso getline, in VS ottengo la linea intera
Codice:
C  .1201070000D+02 CO2          CO2          .3700000000D-03
mentre con MinGW ottengo
Codice:
70000D+02 CO2          CO2          .3700000000D-03
e non capisco davvero perchè! Mi sfugge qualcosa o è un baco?
vendettaaaaa è offline   Rispondi citando il messaggio o parte di esso
Old 22-06-2013, 10:25   #2
vendettaaaaa
Senior Member
 
L'Avatar di vendettaaaaa
 
Iscritto dal: Jan 2012
Messaggi: 1267
Avrei potuto svegliarmi prima a cercare in Google...speriamo almeno che possa tornare utile a qualcun'altro
http://stackoverflow.com/questions/9...x-about-file-r
Quote:
The difference you're seeing between Windows and Linux is because the file is open in text mode: newline characters will be converted silently by the implementation. This means that the combination "\r\n" (used in Windows for newlines) will be converted to a single '\n' character in Windows, making the file have only 8 characters. Note how vim shows a ^M at the end of the first line: that's the '\r' part. In Linux a newline is just '\n'.

You should open the file in binary mode if you want to preserve the original as is:
Codice:
file.open(path, std::ios_base::in | std::ios_base::binary);
Io sono su Windows, ma MinGW a quanto pare usa le stesse librerie di GCC per Linux e quindi il discorso si applica anche al mio caso
vendettaaaaa è offline   Rispondi citando il messaggio o parte di esso
Old 22-06-2013, 10:27   #3
nico159
Senior Member
 
Iscritto dal: Aug 2003
Città: Barletta (BA)
Messaggi: 939
Su Linux con GCC 4.8.1, il tuo file con codifica UNIX da il risultato giusto (82, C .1201070000D+02 CO2 CO2 .3700000000D-03)

Già il fatto che VS ti dica che ti trovi in posizione 85 è strano e fa pensare proprio che il file ha una codifica Windows (ovvero \r\n al posto di \n)

Ecco cosa succede se uso la codifica Windows sul file:
Cannot find Species Data!!
Che è il risultato atteso

VS funziona correttamente perchè la libreria standard di C++ MS controlla il fine riga come prima cosa anche se imposti un tuo delimitatore

Per MinGW invece mi pare un bug - certo che è strano che nessuno lo abbia notato prima - prova a chiedere nella loro mailing list

Forse la maniera più semplice, è usare la codifica *NIX

Fai sapere che ti rispondono sulla loro mailing list
__________________
In a world without fences, who needs Gates?
Power by: Fedora 8 - Mac OS X 10.4.11
nico159 è offline   Rispondi citando il messaggio o parte di esso
Old 22-06-2013, 10:46   #4
vendettaaaaa
Senior Member
 
L'Avatar di vendettaaaaa
 
Iscritto dal: Jan 2012
Messaggi: 1267
Intanto grazie per la risposta!
Io sono stato un po' precipitoso a cantar vittoria: se apro il file in modalità binaria, ora ottengo ad un certo punto
line == "$* ELEMENT DATA\r"
e quel CR fa fallire la comparazione...
Intanto scrivo alla mailing list di MinGW, poi continuo a provare...il fatto strano è che seekg sembra funzionare bene, è proprio tellg che scazza...
vendettaaaaa è offline   Rispondi citando il messaggio o parte di esso
Old 22-06-2013, 12:15   #5
vendettaaaaa
Senior Member
 
L'Avatar di vendettaaaaa
 
Iscritto dal: Jan 2012
Messaggi: 1267
Update: aprendo il file in modalità binaria, leggendo carattere per carattere e stampando i caratteri su un file di output, ottengo che 'C' è il carattere immediatamente successivo all'85 e '7' è successivo a 94:
Quote:
Character 80 = D
Character 81 = A
Character 82 = T
Character 83 = A
Character 84 = \r
Character 85 = \n
Character 86 = C
Character 87 =
Character 88 =
Character 89 = .
Character 90 = 1
Character 91 = 2
Character 92 = 0
Character 93 = 1
Character 94 = 0
Character 95 = 7
Character 96 = 0
Character 97 = 0
Character 98 = 0
Character 99 = 0
mentre aprendo il fine senza specificare ios_base::binary, 'C' sta dopo la posizione 82 come dicevi tu, nico:
Quote:
Character 80 = T
Character 81 = A
Character 82 = \n
Character 83 = C
Character 84 =
Character 85 =
Character 86 = .
Character 87 = 1
Character 88 = 2
Character 89 = 0
Character 90 = 1
Character 91 = 0
Character 92 = 7
Character 93 = 0
Character 94 = 0
Character 95 = 0
Character 96 = 0
Character 97 = D
Character 98 = +
Character 99 = 0
Sembrerebbe quindi che tellg() restituisca la posizione leggendo i caratteri "raw" anche se il file è stato aperto in modalità text...
Codice:
// Open input file stream
bool binary = true;
ifstream ifs;
if (binary)
	ifs.open("Test Element.txt", ios_base::binary);
else
	ifs.open("Test Element.txt");

if (!ifs)
	throw runtime_error("Couldn't open the input file!!\n");

ofstream ofs("tellg debug.txt");
if (!ofs)
	throw runtime_error("Couldn't open the output file!!\n");

char c;
string s;
int n = 0;
while (ifs.get(c))
{
	++n;
	s += c;

	if (n < 100)
	{
		ofs << "Character " << n << " = ";
		if (c == '\r')
			ofs << "\\r" << endl;
		else if (c == '\n')
			ofs << "\\n" << endl;
		else if (c == '\t')
			ofs << "\\t" << endl;
		else
			ofs << c << endl;
	}
}

cout << "String s: " << endl << s << endl << endl;

ofs << endl;
if (binary)
	ofs << "File opened in binary mode" << endl;
else
	ofs << "File opened in text mode" << endl;

ofs << "Character 82 = " << s[82] << endl << endl;
ofs << "Character 83 = " << s[83] << endl << endl;
ofs << "Character 85 = " << s[85] << endl << endl;
ofs << "Character 94 = " << s[94] << endl << endl;

return 0;
vendettaaaaa è offline   Rispondi citando il messaggio o parte di esso
Old 22-06-2013, 14:12   #6
nico159
Senior Member
 
Iscritto dal: Aug 2003
Città: Barletta (BA)
Messaggi: 939
Su *NIX (Linux, Mac OS X, FreeBSD...) non c'è alcun bisogno di conversione, quindi il discorso si chiude qua

La libreria standard di MS pare gestire i casi come std::getline direttamente all'interno della funzione, senza nascondere allo sviluppatore i caratteri \r che vengono conteggiati anche in text mode.
Non avendo mai programmato C++ su Windows non so dirti di più

MinGW nasconde le differenze tra \n e \r\n sfruttando il fatto che è qualcosa che lo standard prevede - il problema è che pare buggato

Il tutto non dovrebbe dare problemi, finchè:
- Non provi ad aprire un file creato su Windows su *NIX
- Non usi un compilatore che ha problemi

Più o meno è la situazione che si trova anche in altri luoghi (Java, C#...)
__________________
In a world without fences, who needs Gates?
Power by: Fedora 8 - Mac OS X 10.4.11
nico159 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Recensione vivo X300 Pro: è ancora lui il re della fotografia mobile, peccato per la batteria Recensione vivo X300 Pro: è ancora lui il...
Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'' per spingere gli handheld gaming PC al massimo Lenovo Legion Go 2: Ryzen Z2 Extreme e OLED 8,8'...
AWS re:Invent 2025: inizia l'era dell'AI-as-a-Service con al centro gli agenti AWS re:Invent 2025: inizia l'era dell'AI-as-a-Se...
Cos'è la bolla dell'IA e perché se ne parla Cos'è la bolla dell'IA e perché se...
BOOX Palma 2 Pro in prova: l'e-reader diventa a colori, e davvero tascabile BOOX Palma 2 Pro in prova: l'e-reader diventa a ...
La capsula SpaceX Dragon CRS-33 ha acces...
La NASA è sempre più vicin...
Crisi delle memorie: ASUS torna al passa...
Le console next-generation potrebbero es...
Gemini cresce ancora: la quota di mercat...
Samsung sfida TSMC: la capacità produtti...
Iliad alza il prezzo della fibra ottica ...
Il prossimo low cost di POCO sarà il più...
The Elder Scrolls VI: ecco le ultime sul...
Ecco i saldi di fine anno Amazon, 34 off...
iPhone Fold: scorte limitate al lancio m...
OpenAI porterà la pubblicità in ChatGPT ...
TSMC aumenterà ancora i prezzi: nel 2026...
Marvel pubblica anche il secondo teaser ...
Nuovo accordo tra xAI e il Pentagono: l'...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 01:06.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v