Un montón de preguntas acerca de archivo de E / S (lectura / escritura de cadenas de mensajes)

StackOverflow https://stackoverflow.com/questions/2619264

  •  26-09-2019
  •  | 
  •  

Pregunta

Para este proyecto universitario que estoy haciendo (para lo cual he hecho un par de puestos en el pasado), que es una especie de red social, se requiere la capacidad de los usuarios para intercambiar mensajes.

Al principio, mis diseñado estructuras de datos para mantener todos los mensajes en una lista enlazada, lo que limita el tamaño del mensaje a 256 caracteres. Sin embargo, creo que mis instructores preferirán si salvo los mensajes en el disco y leerlos solamente cuando los necesito. Por supuesto, no van a decir lo que prefieren, tengo que hacer una elección y justificar lo mejor que pueda por qué fui esa ruta.

Una cosa a tener en cuenta es que sólo tengo que guardar los últimos 20 mensajes de cada usuario, no más.

En este momento tengo una tabla hash que actuará como bandeja de entrada, esto será en el interior del perfil de usuario. Esta tabla Hash será indexado por nombre (el usuario que ha enviado el mensaje). El valor de cada elemento será una estructura de datos que contiene una matriz de size_t con 20 elementos (20 mensajes como he dicho anteriormente). La idea es hacer un seguimiento de los desplazamientos de archivo de disco y bytes escritos. Entonces, cuando necesito para leer un mensaje, sólo necesito el uso fseek() y leer los bytes necesarios.

creo que esto podría funcionar muy bien ... podría utilizar sólo una sola fila para mantener todos los mensajes de todos los usuarios de la red. Yo digo que un solo archivo porque un colega pidió un instructor acerca de cómo guardar los mensajes de cada usuario de forma independiente lo que respondió que tal vez no sea el mejor enfoque causa el sistema de archivos tiene sus límites. Es por eso que estoy pensando en tomar la ruta de una sola fila.

Sin embargo, esto presenta un problema ... Ya que sólo tener que salvar los últimos 20 mensajes, que tienen que descartar los más viejos cuando llegue a este límite.

No tengo ni idea de cómo hacer esto ... Todo lo que sé es sobre fread() y fwrite() para leer / escribir los bytes desde / a archivos. ¿Cómo puedo ir a un desplazamiento de archivo y decir "bueno, elimine los siguientes bytes X"? Incluso si pudiera hacer eso, hay otro problema ... Todas las compensaciones por debajo que uno será completamente diferente y que tendría que procesar todos los buzones de los usuarios para solucionar el problema. Lo cual sería un dolor ...

Por lo tanto, cualquier sugerencia para resolver mis problemas? ¿Qué sugieres?

¿Fue útil?

Solución

No se puede eliminar de forma arbitraria bytes desde el medio de un archivo; la única forma en que funciona es volver a escribir el archivo completo sin ellos. Sin tener en cuenta la cuestión de si hacer las cosas de esta manera es una buena idea, si se han fijado los campos de longitud, una solución sería simplemente sobreescritura el mensaje más antiguo con la más reciente; de esa forma, el tamaño / posición del mensaje en el disco no cambia, por lo que ninguno de los otros desplazamientos se ven afectados.

Editar: Si está permitido el uso de bibliotecas externas, por lo que un simple SQLite db podría ser una buena solución.

Otros consejos

Usted está complicando su camino a la vida más de lo que necesita.

Si los mensajes son 256 caracteres, a continuación, utilizar una matriz de 256 caracteres para contener cada mensaje.

Escribir en el disco con fwrite, lea con fread, eliminarla cambiando el primer carácter de la cadena de \ 0 (o cualquier otra cosa que se te ocurra) y de escritura que en el disco.

Mantener un índice de los mensajes en una estructura simple (nombre de usuario / regnum) y rebotar en el archivo con fseek. Puede ya sea por fuerza bruta el siguiente registro libre al escribir una nueva (empezar a leerlo desde el principio del archivo y parada cuando se golpea la \ 0) o mantener un índice de registros libres en una matriz y agarrar uno de ellos cuando la escritura una nueva (o si la matriz está vacía, entonces fseek al final del archivo y escribir un nuevo registro completo.)

Quiero sugerir otra solución De forma complementaria:

Las cadenas tienen que estar terminando con un carácter nulo bytes, "hello world\0", por lo que se puede leer los datos binarios sin formato hasta alcanzar "\0". Otros tipos de datos han fijado los bits, se guarda de byteorder (endian).

También se podría definir una carga útil antes de cada mensaje, para que sepa su longitud de cadena:

"11hello world;2hi;15my name is loco"

Por lo tanto lo que es posible tratar fragmentos primas como campos de datos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top