hola, una consulta...en una parte de un ejercicio me pide que divida un archivo por medio de saltos de linea, el usuario debe ingresar en cuantas partes quiere dividir el archivo, el caso es que no se porque no puedo imprimir el salto de linea donde yo quiero, el código que hice es el siguiente:
#include<stdio.h>
int main(){
FILE *fp1;
int n,a=0, suma=0, cant/*cantidad de datos a agarrar por partes*/;
char c;
char entrada[100];
printf("Ingrese el nombre del archivo origen:\n");
scanf("%s",entrada);
if((fp1=fopen(entrada,"a+"))==NULL){
printf("\nError al abrir el archivo %s",entrada);
return 0;
}
printf("\n ¿en cuantas partes desea partir el archivo?: ");
scanf("%d", &n);
c=fgetc(fp1);//Acá calculo cuantos bytes tiene el archivo;
while (!feof(fp1)){
a=sizeof(c);
suma=suma+a;
a=0;
c=fgetc(fp1);
}
cant=suma/n;//cantidad de bytes que debo agarrar para cada parte.
suma=0;
rewind(fp1);
c=fgetc(fp1);// acá deberia imprimir el enter cuando alcancé la cantidad de bytes requeridos para una parte;
while(!feof(fp1)){
a=sizeof(c);
suma = suma+a;
if (suma==cant){
fprintf(fp1, "\n");
suma=0;
a=0;
}
a=0;
c=fgetc(fp1);
}
fclose(fp1);
}
c=fgetc(fp1);//Acá calculo cuantos bytes tiene el archivo;
El que???? Asi no se calcula eso ahi solo obtienes el primer byte del contenido del archivo.
Para saber cuanto pesa un archivo tienes que usar la libreria sys/stat.h
#include <sys/stat.h>
//Dentro de main:
int size = fsize("nombre"):
//Funcion aparte.
off_t fsize(const char *filename) {
struct stat st;
if (stat(filename, &st) == 0)
return st.st_size;
return -1;
}
Fuente: http://stackoverflow.com/questions/8236/how-do-you-determine-the-size-of-a-file-in-c
Saludos!!
yo me referia a lo siguiente, si tengo un frase en el archivo: "holaquetal" y yo quiero separar la misma de la siguiente forma: hola \n que \n tal. con el fgetc y el while voy sacando y contando caracter por caracter para saber donde imprimir el salto de linea. o sea...no es que calculo cuanto pesa el archivo propiamente dicho, eso fue un error de tipeo mio.
Hola ten en cuenta que estas imprimiendo en el mismo archivo que estas leyendo. con lo cual cada vez que imprimas un enter, realmente estas sustituyendo el caracter que se encontraba en una posicion adelante dwl cual acababas de leer. Necesitas
a) crear un nuevo archivo temporal donde se reflejen los cambios y hacer el intercambio de archvio
b) leer todo en memoria y reescribir el archvio desde 0 ya con loa cambios hechos.
Saludos
probaré con eso, gracias!