|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#21 |
|
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Beh, mi sembra che vim e The_ouroboros abbiano colpito un'altra volta
Stai leggendo un file che non e' nel formato che ti aspettavi. Nei miei test avevo creato il file in accordo col software, ma ho paura che si debba fare il contrario
__________________
In God we trust; all others bring data |
|
|
|
|
|
#22 |
|
Junior Member
Iscritto dal: Jun 2011
Messaggi: 25
|
Non ci sto capendo molto!
Quale sarebbe la soluzione? |
|
|
|
|
|
#23 |
|
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Prima di tutto bisognerebbe sapere quali sono le specifiche
1 - se hai scritto il software in base alle specifiche (quindi ti aspetti il numero delle coppie e poi le coppie stesse) allora il file non e' conforme. Potresti chiedere a chi ti ha fornito il file di esportarlo nuovamente (i vari ^M rappresentano una diversa codifica del newline, probabilmente il file e' passato da sistema a sistema); 2 - se la risposta e' "questo c'abbiamo", allora forse e' meglio capire cosa ci devi fare con il file. Supponendo che il file sia comunque nel formato <numero di coppie, <coppie>>, allora puoi semplicemente abbandonare la lettura mediante fscanf() e cercare qualcosa di piu' robusto. Per esempio, se il file non e' troppo grosso (i computer odierni hanno un sacco di RAM) potrei leggere tutto il file in un botto, portandomelo in un buffer in memoria. Poi potrei scandire il buffer, scartando i caratteri che non mi servono e decodificando i numeri; 3 - Se oltre alla risposta "questo c'abbiamo" e' in dubbio anche il formato del file, non scrivere codice ma cerca di chiarire bene la struttura del file. Dopo di che puoi scrivere del codice elegante e robusto che lo decodifica
__________________
In God we trust; all others bring data |
|
|
|
|
|
#24 | |
|
Junior Member
Iscritto dal: Jun 2011
Messaggi: 25
|
Allora il problema è che questo è un esercizio di olimpiadi d'informatica, dove nella descrizione del problema vi sono delle assegnazioni, ma quando vado a testarlo nel loro sistema non passa i test perché non legge il file correttamente.
Per esempio poi vi sono le assegnazioni che non vengono rispettate, di seguito il testo dell'esercizio: Quote:
|
|
|
|
|
|
|
#25 |
|
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
Ohé,
è un file misto Linux/Windows: ![]() Notepad++ mostra che alcune righe sono terminate con CR/LF(Windows); altre con LF(Linux). |
|
|
|
|
|
#26 |
|
Junior Member
Iscritto dal: Jun 2011
Messaggi: 25
|
Ma io non capisco ancora da cosa sia dovuto!!!
Ok,può essere un problema del correttore on-line che ha generato sti input sbagliati,ma se io gli riscrivo è sempre lo stesso problema! Mah |
|
|
|
|
|
#27 |
|
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
Ti conviene usare un bell'automa come quello che abbiamo utilizzato nel contest 5:
http://www.hwupgrade.it/forum/showth...1799059&page=2 e pure più veloce http://www.hwupgrade.it/forum/showpo...2&postcount=21 http://www.hwupgrade.it/forum/showpo...5&postcount=24 Ultima modifica di Vincenzo1968 : 11-02-2013 alle 23:27. |
|
|
|
|
|
#28 |
|
Junior Member
Iscritto dal: Jun 2011
Messaggi: 25
|
Scusa di che automa parli?
|
|
|
|
|
|
#29 |
|
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
Non ti fare impressionare dal nome. L'implementazione è una cavolata. Si tratta di un semplice ciclo while:
http://www.hwupgrade.it/forum/showpo...5&postcount=24 |
|
|
|
|
|
#30 |
|
Junior Member
Iscritto dal: Jun 2011
Messaggi: 25
|
Ehm...
Grazie,ma...come avete capito ho cominciato da poco a programmare e ci sto capendo poco di tutto quel codice... Come dovrei utilizzarlo? |
|
|
|
|
|
#31 |
|
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
|
|
|
|
|
|
#32 |
|
Junior Member
Iscritto dal: Jun 2011
Messaggi: 25
|
Grazie mille!
Mi fa' arrabbiare il fatto che le assunzioni delle variabili sono comprese tra 1 e 365 per d e s, quando poi nel file di test ci sono numeri del tipo 4450, i numero di righe compreso tra 1 e 100 e invece nel test 3500 etc. Mah! Comunque aspetto "tue notizie"! ...se c'è qualcuno con qualche altra soluzione si faccia avanti! |
|
|
|
|
|
#33 |
|
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
L'automa mi dice che ci sono caratteri non validi.
Non è che il file "input.txt" è nel formato unicode(utf8)? Se si, bisogna utilizzare i caratteri unicode per leggere il file(wchar.h). |
|
|
|
|
|
#34 |
|
Junior Member
Iscritto dal: Jun 2011
Messaggi: 25
|
Questa cosa non la so', ma scusami non era già venuto fuori che ci fossero caratteri estranei?
Cmq io i numeri gli leggo come interi, cosa dovrei cambiare? |
|
|
|
|
|
#35 | |
|
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
Quote:
Il discorso cambia se il file è in formato, per esempio, UTF-8. In questo caso bisogna utilizzare i caratteri unicode(definiti nel file wchar.h) che hanno la dimensione di due byte anziché uno. E bisogna utilizzare le apposite funzioni al posto di fgets, etc. Si potrebbe implementare ina funzioncina per leggere il formato del file e utilizzare le funzioni appropriate, ASCII/Unicode, in base a quanto restituito dalla funzioncina. Informati un po'; cerca di sapere in che formato è il file di input. |
|
|
|
|
|
|
#36 |
|
Junior Member
Iscritto dal: Jun 2011
Messaggi: 25
|
Ok sto iniziando a capire, ma come dicevo prima non so' di che tipo è il file.
So' solo che è un file txt, che hanno creato per fare i test nel correttore on-line. Ma siamo sicuri che sia questo il problema del caricamento sbagliato dei numeri in matrice? |
|
|
|
|
|
#37 |
|
Senior Member
Iscritto dal: May 2007
Città: Milano
Messaggi: 7103
|
m ai sottovalurare il formato e come enda la linea (LF o CR+LF)
__________________
Apple Watch Ultra + iPhone 15 Pro Max + Rog Ally + Legion Go |
|
|
|
|
|
#38 | |
|
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
Con questo file:
Quote:
![]() Questo è il codice: Codice:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
#include <time.h>
#define BUFFER_SIZE 4096
typedef enum tagStati
{
S_ERROR = -1, S0, S1
} Stati;
int GetArraySize(const char *szFileName)
{
int array_size = 0;
FILE *fp;
unsigned char buffer[BUFFER_SIZE + 1];
int numread;
int k;
unsigned char c;
unsigned char byteCR = 0x13;
unsigned char byteLF = 0x10;
fp = fopen(szFileName, "rb");
if ( fp == NULL )
{
printf("Errore nell'apertura del file %s\n", szFileName);
return S_ERROR;
}
numread = fread(buffer, 1, BUFFER_SIZE, fp);
if (numread == 0)
{
fclose(fp);
printf("Errore 4 nella lettura del file %s\n", szFileName);
return S_ERROR;
}
*(buffer + numread + 1) = '\0';
k = 0;
c = *(buffer + k);
array_size = 0;
while ( c != '\n' )
{
if ( c >= '0' && c <= '9' )
{
array_size = array_size * 10 + c - '0';
}
k++;
c = *(buffer + k);
}
fclose(fp);
return array_size;
}
Stati DFA(const char *szFileName, unsigned int **a, int array_size)
{
Stati stato = S0;
FILE *fp;
unsigned char buffer[BUFFER_SIZE + 1];
int numblocks;
int numread;
char c;
int k, x;
int riga, colonna;
int num;
unsigned char byteCR = 0x13;
unsigned char byteLF = 0x10;
fp = fopen(szFileName, "rb");
if ( fp == NULL )
{
printf("Errore nell'apertura del file %s\n", szFileName);
return S_ERROR;
}
if ( fseek(fp, 0, SEEK_END) )
return 0;
numblocks = ftell(fp)/BUFFER_SIZE;
if ( numblocks == 0 )
{
numblocks = 1;
}
else
{
if ( ftell(fp) % BUFFER_SIZE != 0 )
numblocks++;
}
fseek(fp, 0, SEEK_SET);
numread = fread(buffer, 1, BUFFER_SIZE, fp);
if (numread == 0)
{
fclose(fp);
printf("Errore 1 nella lettura del file %s\n", szFileName);
return S_ERROR;
}
k = 0;
c = *(buffer + k);
k++;
while ( c != '\n' )
{
if (c == '\0')
{
printf("Errore 2 nella lettura del file.\n");
fclose(fp);
return S_ERROR;
}
c = *(buffer + k);
k++;
}
riga = colonna = 0;
num = 0;
x = 0;
while ( x < numblocks )
{
c = *(buffer + k);
k++;
switch ( stato )
{
case S0:
num = 0;
if ( c >= '0' && c <= '9' )
{
num = c - '0';
stato = S1;
}
else if ( c == '\0' )
{
return stato;
}
else if ( c == '\n' )
{
colonna = 0;
riga++;
if (riga >= array_size)
return stato;
}
else
{
printf("Automa: Stato S0 errore sul carattere -> '%c' k -> %d\n", c, k);
return S_ERROR;
}
break;
case S1:
if ( c >= '0' && c <= '9' )
{
num = num * 10 + c - '0';
}
else if ( c == ' ' )
{
a[riga][colonna] = num;
num = 0;
colonna++;
stato = S0;
}
else if ( c == '\n' )
{
a[riga][colonna] = num;
num = 0;
riga++;
colonna = 0;
stato = S0;
}
else
{
printf("Automa: Stato S1 errore sul carattere -> '%c'\n", c);
return S_ERROR;
}
break;
}
if ( k >= BUFFER_SIZE )
{
numread = fread(buffer, 1, BUFFER_SIZE, fp);
if (numread == 0)
{
fclose(fp);
printf("Errore 3 nella lettura del file %s\n", szFileName);
return S_ERROR;
}
k = 0;
x++;
}
}
fclose(fp);
return stato;
}
int main()
{
clock_t c_start, c_end;
int x, y;
unsigned int **missioni;
int array_size;
Stati stato;
char *szFileName = "inputISO.txt";
c_start = clock();
array_size = GetArraySize(szFileName);
if ( array_size <= 0 )
return;
printf("\nNumero righe: %d\n", array_size);
missioni = (unsigned int**)malloc(sizeof(unsigned int*)*array_size);
if ( missioni != NULL )
{
for ( x = 0; x < array_size; x++ )
{
missioni[x] = (int*)malloc(sizeof(int)*2);
if ( missioni[x] == NULL )
{
printf("Memoria insufficiente.\n");
return S_ERROR;
}
}
}
else
{
printf("Memoria insufficiente.\n");
return S_ERROR;
}
stato = DFA(szFileName, missioni, array_size);
if ( stato == S_ERROR )
{
printf("L'automa ha restituito un errore.\n");
return -1;
}
c_end = clock();
printf("\nTempo impiegato per la lettura del file -> %5.5f secondi\n", (double)(c_end - c_start) / CLOCKS_PER_SEC);
printf("\nGli elementi della matrice:\n");
for ( x = 0; x < array_size; x++ )
{
for ( y = 0; y < 2; y++ )
{
printf("missioni[%d][%d] -> %d\n", x, y, missioni[x][y]);
}
printf("\n");
}
printf("\n");
for ( x = 0; x < array_size; x++ )
free(missioni[x]);
free(missioni);
return 0;
}
Se il file in input è in formato UTF-8 dobbiamo modificare il codice in modo da utilizzare i caratteri unicode. |
|
|
|
|
|
|
#39 |
|
Senior Member
Iscritto dal: May 2007
Città: Milano
Messaggi: 7103
|
__________________
Apple Watch Ultra + iPhone 15 Pro Max + Rog Ally + Legion Go |
|
|
|
|
|
#40 |
|
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
Questa è la versione unicode:
cut ![]()
Ultima modifica di Vincenzo1968 : 12-02-2013 alle 18:28. Motivo: Eliminato codice buggato. |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 23:27.























