C/Visual C - Solicito ayuda con un pequeño proyecto

 
Vista:
Imágen de perfil de Juan Pablo

Solicito ayuda con un pequeño proyecto

Publicado por Juan Pablo (3 intervenciones) el 30/03/2014 05:38:23
Hola a todos! les mando este mensaje porque solicito ayuda con este pequeña porcion de un programa grande

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
void
patch_dialogue(unsigned char *rom, FILE *fp)
{
	char buf[8192];
	int addr;
 
	int begin = -1;
	int check;
	dlg_t *c;
 
	while (fgets(buf, sizeof(buf), fp)) {
		/* begin ADDR */
		if (sscanf(buf, "begin %x", &begin) == 1) {
			read_dialogue(rom, begin);
			continue;
		}
 
		/* end ADDR */
		if (sscanf(buf, "end %x", &addr) == 1) {
			assert(begin >= 0);
			check = write_dialogue(rom, begin);
			begin = -1;
 
			if (check == addr);
			else if (check < addr) {
				fprintf(stdout, "unused space (0x%x < 0x%x)\n", check, addr);
			}
			else {
				fprintf(stderr, "out of space (0x%x > 0x%x)\n", check, addr);
			}
			continue;
		}
 
		else if (strncmp(buf, "addr", 4) == 0) {
			c = script_addr(buf, c);
		}
		else if (strncmp(buf, "seek", 4) == 0) {
			c = script_seek(buf, c);
		}
		else if (strncmp(buf, "skip", 4) == 0) {
			c = script_skip(buf, c);
		}
		else if (strncmp(buf, "insert", 6) == 0) {
			c = script_insert(buf, c);
		}
		else if (strncmp(buf, "delete", 6) == 0) {
			c = script_delete(buf, c);
		}
 
		/* Comment. */
		else if (buf[0] != '\0' && buf[0] != '#' &&
				buf[0] != '\n' && buf[0] != '\r') {
			fprintf(stderr, "unrecognised command: %s", buf);
		}
	}
}
 
void
patch_dlg(const char *fn)
{
	FILE *fp = fopen(fn, "r");
 
	if (fp != NULL) {
		patch_dialogue(s_rom, fp);
		fclose(fp);
	}
	else {
		fprintf(stderr, "Could not open patch %s\n", fn);
	}
}
 
static void
translate_dialogue(void)
{
	int i;
 
	for (i = 0; k_script[i] != NULL; i++) {
		patch_dlg(k_script[i]);
	}
}
v
 
 
int
main(int argc, char *argv[])
{
	(void)argc, (void)argv;
 
	read_rom("sncsm3.gba");
 
	create_font();
	translate_name_entry_menu();
	translate_main_menu();
	translate_items();
	translate_magics();
	translate_weapons();
	translate_specials();
	translate_effects();
	translate_bestiary();
	translate_dialogue();
 
	write_rom("out.gba");
 
	return 0;
 
}

lo que hace es llamar a las sucesivas funciones para traducir un texto que va de japones en español, para eso recibe como archivo txt el texto traducido, en fin el caso es que despues de cambiar la configuracion del txt por error( recuerdo que me aparecio un mensaje confirmando si realmente queria cambiarlo) cada vez que lo ejecuto los comandos que lee directamente los direcciona a unrecognised command, como que no puede leerlo.


Haciendo el debug correpondiente me encontre con que en el fgets

(fgets(buf, sizeof(buf), fp))

este me devolvia de retorno no el sizeof buf, sino un valor mucho mayor es como que el fgets es truncado por el \n, sino que antes no pasaba eso, lo leia todo y reconocia todos los comandos.

ya he probado cambiando la codificacion a ansi, unicode, UTF-8 y nada, sigue dando error de unrecognised command.

el error no puede estar en otra parte porque el programa no es mio, lo estoy usando de otra persona y para evitar que fuera un problema mio directamente lo baje de vuelta y no toque nada mas, pero el error sigue estando.

mi pregunta es, ¿El error del fgets puede estar relacionado con la codificacion del archivo txt? ¿ sera porque utiliza el caracter de \r de fin de linea de linux?

Muchas gracias por su ayuda!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Solicito ayuda con un pequeño proyecto

Publicado por Tom (619 intervenciones) el 30/03/2014 19:09:31
Es normal que fgets te devuelva un valor grande, ya que se trata de un puntero a char.
Unixes y linuxes usan \n como terminador de línea, es Window$ el que usa '\r\n".
Me temo que sin ver el contenido del fichero es bastante difícil adivinar qué pasa.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Solicito ayuda con un pequeño proyecto

Publicado por Chema (234 intervenciones) el 30/03/2014 19:57:59
No se nada de windows, pienso que a lo mejor podría ser cuestión de permisos
FILE *fp = fopen(fn, "r");
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Solicito ayuda con un pequeño proyecto

Publicado por UnoPorAhi (15 intervenciones) el 30/03/2014 20:01:04
Buenas,

En mi opinión el fgets está bien, ya que buf no es un puntero a char sino un array de char, por lo que debería devolver el tamaño correcto (8192) del buffer. Yo más bien creo que el texto se trunca porque no es capaz de leer más del fichero, como si encontrase un EOF antes de tiempo.

Hablas de caracteres japoneses. Puede ser un problema de codificación? Quizás necesitas leerlo como UTF-8. Si estás utilizando visual studio sería tan sencillo como cambiar:

FILE *fp = fopen(fn, "r");

Por

FILE *fp = fopen(fn, "r, ccs=UTF-8");

http://msdn.microsoft.com/en-us/library/yeby3zcb.aspx


Si usas GCC puede ser un poco más laborioso:
http://stackoverflow.com/questions/2113270/how-to-read-unicode-utf-8-binary-file-line-by-line

Un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Juan Pablo

Solicito ayuda con un pequeño proyecto

Publicado por Juan Pablo (3 intervenciones) el 31/03/2014 23:32:29
gracias las respuestas!

aqui les adjunto el archivo que quiere intentar leer, si mal no interpreto lo que hace es leer el tamaño de buf, leer el dialogo, e intertarlo en el rom de manera tal que no se solapee con alguna otra instruccion.

el caso es que no entiendo porque al debuggear cuando hace el fgets la primera vez buf tiene:

Day 0 introduction script translation notes below.

despues:


On the left are the original translations by Jackson et al.

siendo que antes eso no lo hacia, directamente imprimia la seccion del rom que habia sido modificad, ahora imprime

unrecognised command: On the left are the original translations by Jackson et al.

supongo yo que ahora el fgets se trunca de alguna manera, siendo que antes no lo hacia!

Esto lo probe en mi computadora que tiene Windows 8, uso el dev c++ 5.0.1.2 ( una version modificada por otra persona) y pasa lo mismo, estoy con mi otra compu que tiene windows / y ahora intente compilar el proyecto de vuelta y ni lo lee!!!

la verdad no entiendo que pueda estar mal
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Juan Pablo

Solicito ayuda con un pequeño proyecto

Publicado por Juan Pablo (3 intervenciones) el 02/04/2014 05:51:25
Me figuro que algo de la codificacion tiene que ser, pero ya he intentado con ANSI, UNICODE, UTF-8 y sigue dando lo mismo solo.

Recuerdo que antes de eso, cuando me andaba bien el programa, tuve que cambiar una codificacion para otro trabajo que estaba haciendo, cuando lo quise hacer windows me tiro un mensaje como que de precaucion, que no lei bien
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar