2016-07-19 1 views
0

J'ai écrit un code en C dans lequel je copie le contenu d'un fichier PDF d'un endroit à un autre pour un traitement ultérieur. Ce que je fait est:Copie de fichier PDF incorrecte en utilisant C

Ouvrez le fichier en mode lecture binaire

if ((fp = fopen(argv[6],"rb")) == 0) { 
     fprintf(stderr, "ERROR: Can't open input file %s\n",argv[6]); 
     goto out; 
} 

Puis-je enregistrer le contenu du fichier PDF à un emplacement temporaire

/* save the contents for the file to a temporary location */ 
    tempfp = fopen(CUPS_IPTEMPFILE, "wb"); 
    while ((n = fread(buf, 1, BUFSIZ, fp)) > 0) { 
    count = fwrite(buf, 1, BUFSIZ, tempfp); 
    } 
    fclose(tempfp); 

J'utilise MuPDF pour ouvrir la fichier; bien que MuPDF est capable d'afficher correctement le fichier, il donne l'erreur suivante sur le terminal:

$ mupdf cupsiptempfile.pdf 
error: cannot find startxref 
warning: trying to repair broken xref 

Si j'utilise Okular pour afficher le même fichier, je n'obtenir aucune erreur

$ okular cupsiptempfile.pdf 
okular(12821)/kdecore (KConfigSkeleton) KCoreConfigSkeleton::writeConfig: 
okular(12821)/kdecore (KConfigSkeleton) KCoreConfigSkeleton::writeConfig: 
okular(12821)/kdecore (KConfigSkeleton) KCoreConfigSkeleton::writeConfig: 
okular(12821)/kdecore (KConfigSkeleton) KCoreConfigSkeleton::writeConfig: 
okular(12821)/kdecore (KConfigSkeleton) KCoreConfigSkeleton::writeConfig: 

Pourquoi il y a une différence ici? Est-ce que je fais quelque chose de mal avec la partie copie?

Informations supplémentaires: Lorsque j'ouvre le fichier PDF d'origine en utilisant MuPDF, il n'y a PAS d'erreur.

N'hésitez pas à demander toute information complémentaire que vous souhaitez.

+3

Lorsque vous copiez vous écrivez des caractères BUFSIZ mais vous pourriez ne pas avoir lu les caractères BUFSIZ - la variable n est là pour vous dire combien de caractères ont été lus si c'est combien vous devriez écrire . –

+0

@JerryJeremiah Oui, vous avez raison. Cela a résolu le problème. Je suis stupide, je n'ai pas remarqué celui-là. – Pranjal

+0

Content de t'avoir aidé. –

Répondre

2

Le problème est ici:

while ((n = fread(buf, 1, BUFSIZ, fp)) > 0) { 
    count = fwrite(buf, 1, BUFSIZ, tempfp); 
} 

Lorsque vous copiez le fichier que vous écrire des caractères BUFSIZ sur mais vous pourriez ne pas avoir lu les caractères BUFSIZ dans - la variable n est là pour vous dire combien de caractères ont été lus si vous devriez seulement écrire ces n caractères. Il devrait probablement ressembler à ceci:

while ((n = fread(buf, 1, BUFSIZ, fp)) > 0) { 
    count = fwrite(buf, 1, n, tempfp); 
}