8
votes

Pourquoi Fread revient-elle toujours 0?

J'ai utilisé ce code pour lire le fichier. Mais la fonction de fread retour toujours 0. Quelle est mon erreur?

FILE *file = fopen(pathToSourceFile, "rb");
if(file!=NULL) 
{
    char aByte[50000];
    int ret = fread(aByte, sizeof(aByte), 1, file);
    if(ret != 0)
    {
        not jump into there;
        fseek(file, 0, SEEK_SET);
        fwrite(aByte, ret, 1, file);
    }
} 
fclose(file); 


13 commentaires

Le fichier a-t-il définitivement au moins 50000 octets?


@Chals, il ne faut pas avoir besoin de. Fread doit renvoyer le nombre d'octets réellement lus, ce qui peut être inférieur à 50000.


Le fichier existe pour que la fread doit être de retour non 0 :(.


@ user418304 Pourquoi avez-vous roulé à la version non formatée?


@Matthew Flaschen: Non. Fread Renvoie le nombre de Objets Lire. Si vous lisez jusqu'à un objet d'octet 50000, il retournera 0 ou 1.


Pourquoi ce marquage est-il marqué C ++ . C'est pur C.


Le fichier est supérieur à 50000 octets car il s'agit d'un fichier MP3 standard.


@Chals, tu as raison; mon erreur. J'aurais dû lire plus attentivement.


Tout le monde peut-il s'il vous plaît Stop Suppression de la balise C ++ de cette question. C'est évidemment la langue que cet utilisateur418304 veut utiliser. Juste parce que le code est également valide C ne signifie pas que la question concerne la question de C. (les gens ne retournent pas de questions comme C ++ simplement parce que le code utilise le sous-ensemble commun, fais-ils?)


Il compile et lit correctement comme C ou C ++. C'est le fwrite cassé.


Son intention n'était pas de honte, c'était d'être précis; C'était incorrect comme écrit. Stackoverflow est recherché par beaucoup pour trouver des réponses. J'essaie d'aider l'Op et donc à la fois. Si vous êtes en désaccord, s'il vous plaît rébranchez mon changement ou de le modifier, je ne "modifierai pas la guerre".


@MSW S'il vous plaît n'essayez pas de justifier de vous moquer de l'OP avec vouloir les aider. Ce type de comportement n'est ni drôle ni aider quelqu'un.


@balpha - Ne présumez pas de connaître mon intention, il est inconnu dans un modérateur.


6 Réponses :


9
votes

Êtes-vous sûr que votre fichier a une taille supérieure à 50000? Sinon, vous pouvez essayer:

 fread(aByte,1, sizeof(aByte),  file);


1 commentaires

Oui parce que j'ai lu des données à partir d'un fichier MP3 que la taille sur disque est de 3,2 Mo: s



3
votes

ferror () va dire quand quelque chose est faux.

Vous pouvez imprimer le message d'erreur réel en utilisant perror () .


1 commentaires

ferror () ne vous dira pas ce que est faux, ça va vous dire si quelque chose est faux - c'est juste une indication vraie / fausse . Utilisation perror () si ferror () retourne vrai est un bon conseil.



1
votes

Vous ne pouvez pas fwrite dans un fichier ouvert dans RB .

Votre relevé que RET est toujours zéro est faux. Si vous aviez correctement instrumenté votre code, vous ne faites pas de fausses réclamations: xxx

rendements: xxx

quand courir.


2 commentaires

Oui désolé je change à RB pour tester Fread. S'il vous plaît passez à la follette. :)


Il est préférable de couper et de coller le code que vous rencontrez des problèmes avec la fin, vous pouvez modifier votre question si votre code change.



-1
votes

Avez-vous:

#include

Sinon, et si vous compilez sans-wall, le compilateur C peut supposer de manière incorrecte que le deuxième argument de Fread () est un intégrement plutôt que d'off_t, qui peut gâcher l'appel de la fonction. Votre extrait de code ne montre aucune déclaration #include, alors assurez-vous que vous incluez tout ce que vous utilisez.


0 commentaires

0
votes

Si quelqu'un d'autre circule dans cela. Je viens de courir dans un problème similaire. C'est parce que la 2e argument de Fread devrait être la taille de chaque élément du tampon fort>. Dans le code de OP, il s'agit de la taille du pointeur sur le tampon.

Ceci devrait fonctionner à condition que Buff a au moins 1 élément: P>

int ret = fread(aByte, sizeof(aByte[0]), 1, file);


0 commentaires

0
votes

Dans mon cas, je voulais lire un fichier de taille 6553600 octets (un MP3), et il revenait 0 octets lus. Il me conduisait fou, jusqu'à ce que j'ai essayé de creuser manuellement 30 octets et j'ai lu 30 octets.

J'ai commencé à jouer avec elle et à voir combien peut-il lire, et il s'avère que cela peut lire exactement 262144 (2 ^ 18) octets, si vous le demandez de lire 262145 octets, il se lit 0.

Conclusion: au moins avec cette fonction, vous ne pouvez pas charger l'ensemble du fichier en une seule fois.


0 commentaires