sisoputnfrba / foro

Foro de consultas para el trabajo práctico
149 stars 7 forks source link

Escribir en archivos de Swamp #2420

Closed joseZudaire closed 2 years ago

joseZudaire commented 2 years ago

Buenas! Mi consulta es capaz un poco tonta, pero no le encuentro la vuelta. En el TP figura que hay que instanciar los archivos con el caracter '\0', lo cual hice. También tomé los ejemplos de las rutas de archivos del TP ([/home/utnso/swap1.bin, /home/utnso/swap2.bin]). Ahora bien, lo que me está pasando es que el archivo toma a '\0' como el fin de archivo, y no escribe tras ese punto. Por ejemplo, si yo escribo "aaaa" y dejo los caracteres nulos hasta el comienzo del próximo marco, y quisiese escribir "aaaa" en el próximo marco, no lo hace. En cambio, si yo escribo 64 veces la letra 'a', no hay problema. Esto sería un problema si por ejemplo en el void* que me pasase memoria hubiera un '\0', porque el archivo no reconocería como contenido el resto de lo que me pasaron. ¿Qué haría en ese caso?

iago64 commented 2 years ago

Buenas! Cómo va?

2 preguntas importantes: 1.- Cómo estas viendo el contenido del archivo? 2.- Cuándo escribís? Cómo estas escribiendo los datos?

Saludos.-

tferraro commented 2 years ago

Buenas! Aprovecho para meter bocado, las preguntas que está diciendote Dami son para orientar un poco la charla 😉 Si miro "por arriba" lo que me contás (sin saber nada extra), mi intuición me dice que algo estás trabajando como string; cuando persé la memoria en el archivo son...bytes; y muy posiblemente algo de la forma de leer o escribir sea para trabajar cadenas de caracteres y no persé con streams de datos.

Pero es una suposición nomás! Contanos un poco como lo estás trabajando y vemos como podemos orientarte 🙂

joseZudaire commented 2 years ago

Buenas! Gracias por las respuestas! :) @iago64 te contesto las preguntas: (1) Lo veo abriendo el .bin en archivo txt y también haciendo un read del contenido del archivo. En ambos pasaba lo mismo. (2) Escribo cuando me llega una operación de escritura. Te dejo acá un ejemplo de las líneas en cuestión:

void* archivoMmapeado = mmap(0, datosConfigSwamp->tamanio_swamp,PROT_WRITE | PROT_READ, MAP_SHARED,file,0);
char* algo2 = "a x 64"; //es 'a' escrito 64 veces
memcpy(archivoMmapeado + datosConfigSwamp->tamanio_pagina*indiceMarco, algo2,64); 

El espíritu es el mismo. Me llega un void* y haría el memcpy a la posición del archivoMmapeado que correspondiese.

joseZudaire commented 2 years ago

Buenas @tferraro! Vos decís que si cambio el char a void se solucionaría esto? EDIT: no me lo resolvió

iago64 commented 2 years ago

Buenas!

Si el archivo lo abrís con un editor de texto no vas a ver nada, porque justamente los \0 al editor de texto le complican la existencia, una forma de ver el contenido del archivo es haciendo en una terminal: hexdump -C <nombre del archivo>

Después la forma que tenes de escribirlo esta bien, pero posiblemente no estés viéndolo por la forma en que lo abris.

Saludos.-

joseZudaire commented 2 years ago

Buenas! Era eso, la escritura estaba bien. Cierro el issue ahora. Saludos!