Pourquoi fopen renvoie-t-il un pointeur NULL?
Je suis en train de travailler sur un simple diviseur de fichier/fusion de programme dans le langage de programmation C. Le problème est que, pour une raison quelconque fopen renvoie la valeur NULL, et à cause de cela, mon programme plante à la fwrite déclaration. Comment puis-je résoudre ce problème?
Voici le fichier C:
int SplitFile(char* filename, char* output, size_t size)
{
char current_file_name[256];
int file_count = 0, i = 0;
FILE *file = fopen( filename, "rb" );
printf("split %s into chunks of %d named\n", filename, size);
if (!file)
return E_BAD_SOURCE;
else
{
output = (char *) malloc(size * sizeof(char));
if (output == NULL)
return E_NO_MEMORY;
else
{
int bytes_read = 0;
FILE *outFile;
do
{
bytes_read = fread(output, sizeof(char), size, file );
sprintf(current_file_name, "%s%04lu\n", "part", file_count++);
outFile = fopen (current_file_name, "wb" ); //THIS RETURNS NULL
fwrite(output, sizeof(char), bytes_read, outFile); //CRASHES ON THIS LINE
}
while ( bytes_read > 0 )
;
//fclose(outFile);
}
}
fclose(file);
printf("...\n");
return 0;
}
source d'informationauteur k787
Vous devez vous connecter pour publier un commentaire.
La bonne chose à faire est de vérifier
errno
quandfopen
retourneNULL
.Je vais deviner que votre problème est que vous êtes en train d'écrire à un système de fichiers qui ne permet pas de
\n
dans les noms de fichiers, mais il pourrait être un problème d'autorisations.Il existe de nombreuses raisons
fopen
pouvez retournerNULL
y compris (mais certainement pas limité à):La façon de savoir qui est responsable de creuser dans la
errno
code.Cependant, juste parce que vous résoudre cette erreur ne signifie pas que vous pouvez supposer
fopen
ne reviendra jamaisNULL
. Lorsque vous traitez avec des opérations d'e/S de votre code n'a qu'à s'attendre à l'échec. Il n'est pas possible de prédire le succès d'opérations d'e/S, et ils peuvent toujours voués à l'échec.Que Gabe a dit que ton problème est de retour à la ligne dans le nom de fichier qui est illégal dans Windows.
Mais pourquoi ne pas simplement utiliser split à partir de GNU Utilitaires. Installé par défaut sur les systèmes Unix/Linux, peut être téléchargé pour Windows à partir de GnuWin32 projet.
Est fopen pour écrire retourner la valeur NULL dans la première manche?
J'ai remarqué que dans la pendant que vous gardez les fichiers ouverts pour écrire, mais ne pas les fermer.
Essayez d'ajouter la fonction fclose(outFile) après fwrite:
Il est possible que vous ouvrez plusieurs fichiers de votre système d'exploitation le permet.
Dans mon cas, j'étais en train de lire le même fichier de nouveau dans une boucle while et j'ai oublié de le fermer.
J'ai utilisé une fonction pour lire le fichier et de trouver une correspondance et que la fonction a un
return;
déclaration qui a mis fin à la fonction avant de fairefclose(fp)
😀