Progtwigción de contenido de lectura () y escritura () en archivo.

El usuario debe ingresar algunos nombres de archivos en la línea de comandos y el progtwig leerá cada nombre de archivo de argv[] array. Tengo que realizar la comprobación de errores etc.

Quiero leer cada nombre de archivo. Por ejemplo, si argv [2] es ‘myfile.txt’, el progtwig debería leer el contenido de ‘myfile.txt’ y almacenar el valor en el char buffer[BUFSIZ] y luego escribir el contenido del buffer en otro archivo.

Sin embargo, antes de escribir el contenido, el progtwig también debe escribir el nombre del archivo y el tamaño. De tal manera que el archivo se puede extraer fácilmente más tarde. Un poco como la función tar .

El archivo en el que escribo el contenido del buffer , según la cantidad de archivos agregados por el usuario, debe ser una cadena como:

 myfile.txt256Thisisfilecontentmyfile2.txt156Thisisfile2content.............. 

Mi pregunta es

1) ¿Cómo escribo el valor de argv[2] en el archivo utilizando la statement write() , como tengo problemas para escribir la matriz char, qué debo poner como (sizeof (?)) Dentro de write() . vea a continuación, ya que no sé la longitud del nombre de archivo ingresado por el usuario.

2) ¿Uso el ‘&’ para escribir un valor entero en el archivo después del nombre, por ejemplo, escribir 4 bytes después del nombre del archivo para el tamaño del archivo

Aquí está el código que he escrito,

 char buffer[BUFSIZ]; int numfiles=5; //say this is no of files user entered at command open(file..... lseek(fdout, 0, SEEK_SET); //start begging of file and move along each file some for loop for(i=0-; ...... //for each file write filename,filesize,data....filename,filesize,data...... int bytesread=read(argv[i],buffer,sizeof(buffer)); write(outputfile, argv[i], sizeof(argv)); //write filename size of enough to store value of filename write(outputfile, &bytesread, sizeof(bytesread)); write(outputfile, buffer, sizeof(buffer)); 

Pero el código no funciona como esperaba.

¿Alguna sugerencia?

Como argv consta de matrices terminadas en nulo, la longitud que puede escribir es strlen(argv[2])+1 para escribir tanto el argumento como el terminador nulo:

 size_t sz = strlen (argv[2]); write (fd, argv[2], sz + 1); 

Alternativamente, si desea la longitud seguida de los caracteres, puede escribir el size_t devuelto desde strlen seguido de tantos caracteres.

 size_t sz = strlen (argv[2]); write (fd, &sz, sizeof (size_t)); write (fd, argv[2], sz); 

Es probable que también deba escribir la longitud del archivo para poder localizar el siguiente archivo cuando lo lea.

1., puedes escribir la cadena de la siguiente manera:

 size_t size = strlen(string); write(fd, string, size); 

Sin embargo, la mayoría de las veces no es así de simple: necesitará el tamaño de la cadena para saber cuánto necesita leer. Así que debes escribir el tamaño de la cadena también.

2., Un entero se puede escribir de la siguiente manera:

 write(fd, &integer, sizeof(integer)); 

Esto es simple, pero si planea usar el archivo en diferentes architectures, también tendrá que lidiar con la endianidad.

Parece que su mejor apuesta es usar un formato binario. En su ejemplo, ¿el archivo se llama myfile.txt con una longitud de contenido de 256, o myfile.txt2 con una longitud de contenido de 56, o myfile.txt25 con una longitud de contenido de 6? No hay manera de distinguir entre el final del nombre de archivo y el inicio del campo de longitud del contenido. Del mismo modo, no hay manera de distinguir entre el final de la longitud del contenido y el inicio del contenido. Si debe usar un formato de texto, los campos de ancho fijo le ayudarán con esto. Es decir, 32 caracteres de nombre de archivo seguidos de 6 dígitos de longitud de contenido. Pero el formato binario es más eficiente.

Obtiene la longitud del nombre de archivo usando strlen (), no use sizeof(argv) ya que obtendrá el resultado completamente incorrecto. sizeof(argv[i]) también dará el resultado incorrecto.

Así que escriba 4 bytes de longitud de nombre de archivo seguidos por el nombre de archivo, luego 4 bytes de longitud de contenido seguidos por el contenido.

Si desea que el formato sea portátil, debe tener en cuenta los problemas de orden de bytes.

Por último, si el archivo no cabe en su búfer, entonces usted está lleno. Necesita obtener el tamaño del archivo que está leyendo para escribirlo en su archivo de salida primero, y luego asegúrese de leer ese número de bytes del primer archivo en el segundo archivo. Hay varias técnicas para hacer esto.

gracias por las respuestas chicos,

Decidí no usar la estructura (size_t) en lugar de los tipos asignados (int) y (char), así que sé el valor exacto de los bytes para leer (). es decir, sé que al comienzo del archivo y leo 4 bytes (int) para obtener el valor de la longitud del nombre de archivo, que uso como tamaño en la siguiente lectura ()

Entonces, cuando estoy escribiendo (copiando el archivo exactamente con el mismo nombre), los usuarios ingresaron el archivo al archivo de salida (archivo copiado). Lo escribo en una cadena larga, sin espacios, obviamente, solo para hacerlo legible aquí.

filenamesize filename filecontentsize filecontent ie 10 myfile.txt 5 hola

Entonces, cuando llego a leer esos datos, comienzo al principio del archivo usando lseek () y sé que los primeros 4 bytes son (int), que es la longitud del nombre de archivo, así que lo puse en valor int namelen usando la función de lectura.

Mi problema es que quiero usar ese valor leído para filenamesize (primeros 4 bytes) para declarar mi matriz para almacenar el nombre de archivo con la longitud correcta. ¿Cómo puedo poner esta matriz en read () para que la lectura almacene el valor dentro de la matriz de caracteres especificada?

 int namelen; //value read from first 4 bytes of file lenght of filename to go in nxt read() char filename[namelen]; read(fd, filename[namelen], namelen);//filename should have 'myfile.txt' if user entered that filename 

Entonces, mi pregunta es una vez que leo que los primeros 4 bytes del archivo me dan la longitud del nombre de archivo almacenado en namelen, luego quiero leer la cantidad de bytes de namelen para darme el nombre del archivo original para poder crear un archivo copiado dentro del directorio.

Gracias