Pregunta

Supongamos que tengo un archivo de texto que dice:Este archivo tiene texto sin formato

Ahora, quiero dividir este archivo de texto en el número 'n' de piezas con caracteres iguales. Supongamos que el usuario quiere tres divisiones, luego 1.txt, 2.txt y 3.txt deben crearse, con aproximadamente 8 caracteres cada una.

(La siguiente parte de este programa es volver a unir estos archivos al estado original, pero estoy seguro de que podré hacerlo yo mismo si puedo obtener ayuda con esta primera parte).

¿Pueden guiarme en este asunto?

El lenguaje utilizado es C.

void main(int argc, char** argv)
{
int iChunkNo=0;
char cFileName[30];

iChunkNo = atoi(argv[2]);
strcpy(cFileName, argv[1]);

printf("The file will be divided into %d chunks \n", iChunkNo);

FILE* file_read_pointer;
file_read_pointer = fopen(cFileName, "r");

int iCount=0;
char ch;

while (1) 
{
        ch = fgetc(file_read_pointer);
        if (ch == EOF)
            break;
        ++iCount;
}

printf("The number of characters in the file is: %d \n", iCount);   

int iCharPerFile = 0;
iCharPerFile = iCount/iChunkNo;

printf("The number of characters per chunk file will be: %d \n", iCharPerFile);

FILE* file_write_pointer;   

int j=1;
for(j; j<=iChunkNo; j++)
{   
    char num[5] = {j};
    char ext[4] = {"txt"};

    char name[15];
    sprintf(name, "%d.%s", j, ext);     

    FILE* file_write_pointer;
    file_write_pointer = fopen(name, "w");
}

int i=0;

for(i; i<iCharPerFile; i++)
{
    char temp;
    temp = fgetc(file_read_pointer);
    //fputc(temp, file_write_pointer);
    fprintf(file_write_pointer, "%c", temp);
}
}
¿Fue útil?

Solución

Podrías hacer algo como esto:

  • Encuentre el tamaño del archivo (usando fseek y ftell). Entonces busca volver al principio
  • Determine el tamaño que necesita escribir en cada archivo (tamaño / n)
  • Lea un personaje a la vez (use getc) y escriba en el archivo correspondiente (putc)
    • Usar sprintf(fname, "%d.txt", index) para construir nombres como "1.txt"
    • Usar fopen para abrir archivos y mantener un FILE *current a lo que escribes en cada paso

Dicho esto, debes comenzar lentamente. Primero haga un programa que simplemente copie un archivo en otro usando getc + putc y avanza hacia arriba.

Otros consejos

Tendrá que resolver cuánto texto hay en total, posiblemente 'sorbiendo' todo el archivo en la memoria. Esto funcionará bien para los tamaños de archivos hasta los megabytes en tamaño, pero no para gigabytes y más allá.

Entonces debe saber cuántas partes dividirlo (procesamiento de argumentos de línea de comandos?) Y, por lo tanto, cuántos datos escribir para escribir en cada parte. Esto se seguirá creando cada uno de los archivos de salida, escribiendo el segmento correcto de datos en el archivo y cerrándolo.

Suponiendo que el archivo tiene 29 bytes y debe dividirlo en 3 partes. ¿Creará 2 partes con 9 bytes y una con 11, o 2 con 10 y una con 9. ¿Qué pasa si tiene 28 bytes de largo y 5 partes? (4 x 5 bytes + 1 x 8 bytes? 3 x 6 bytes + 2 x 5 bytes? ¿O son 2 x 5 bytes + 3 x 6 bytes?)

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