La fonction tellg () donne une mauvaise taille de fichier?
J'ai fait un exemple de projet de lecture d'un fichier dans un buffer.
Lorsque j'utilise le tellg (), fonction qu'il me donne une valeur plus grande que la
la fonction de lecture est en fait de lire le fichier. Je pense qu'il y a un bug.
voici mon code:
EDIT:
void read_file (const char* name, int *size , char*& buffer)
{
ifstream file;
file.open(name,ios::in|ios::binary);
*size = 0;
if (file.is_open())
{
//get length of file
file.seekg(0,std::ios_base::end);
int length = *size = file.tellg();
file.seekg(0,std::ios_base::beg);
//allocate buffer in size of file
buffer = new char[length];
//read
file.read(buffer,length);
cout << file.gcount() << endl;
}
file.close();
}
principal:
void main()
{
int size = 0;
char* buffer = NULL;
read_file("File.txt",&size,buffer);
for (int i = 0; i < size; i++)
cout << buffer[i];
cout << endl;
}
source d'informationauteur Elior
Vous devez vous connecter pour publier un commentaire.
tellg
ne prend pas en compte de la taille du fichier, ni le décalagedepuis le début, en octets. Il fait état d'une valeur de jeton qui peut
plus tard être utilisé pour demander à la même place, et rien de plus.
(Il n'est même pas garanti que vous pouvez convertir le type à un
type intégral.)
Au moins selon la spécification du langage: dans la pratique,
sur les systèmes Unix, la valeur retournée sera le décalage en octets
à partir du début du fichier, et sous Windows, il sera
le décalage à partir du début du fichier pour les dossiers ouverts
le mode binaire. Pour Windows (et la plupart des systèmes non-Unix), dans le texte
mode, il n'y a aucun lien direct et immédiat de la cartographie entre ce
tellg
retourne et le nombre d'octets que vous devez lire pour se rendre àde cette position. Sous Windows, tout ce que vous pouvez vraiment compter sur est
la valeur sera pas moins que le nombre d'octets que vous avez
à lire (et dans la plupart des cas réels, ne sera pas trop grand,
bien qu'il peut être jusqu'à deux fois plus).
Si il est important de savoir exactement combien d'octets que vous pouvez lire,
le seul moyen fiable de le faire est par la lecture. Vous devez être
en mesure de le faire avec quelque chose comme:
Enfin, deux autres remarques concernant votre code:
Tout d'abord, la ligne:
ne devrait pas compiler: vous avez déclaré que
buffer
être unchar*
donc
*buffer
a typechar
, et n'est pas un pointeur. Compte tenu de ce quevous semblez être en train de faire, vous voulez probablement déclarer
buffer
commeun
char**
. Mais une bien meilleure solution serait de le déclarercomme un
std::vector<char>&
ou unstd::string&
. (De cette façon, vousne pas avoir de retour de la taille en tant que bien, et vous n'aurez pas de fuite de mémoire
si il y a une exception).
Deuxième, la condition de la boucle à la fin est mauvaise. Si vous avez vraiment
voulez lire les caractères un à un,
devrait faire l'affaire. Une meilleure solution serait probablement d'
lire des blocs de données:
ou encore:
EDIT: je viens de remarquer une troisième erreur: si vous ne parvenez pas à ouvrir le
fichier, vous ne dites pas à l'appelant. À tout le moins, vous devriez
définir la
size
à 0 (mais une sorte d'erreur plus précisla manipulation est sans doute mieux).
fera le fichier si le fichier est ouvert par fopen
à l'aide de ifstream,
ferait similaire
Ces lignes ne regardent pas comme un bug: vous créez un tableau de char et d'économiser sur le tampon[0] char. Puis vous lisez un fichier vers un tampon, qui est toujours initialisée.
Vous avez besoin pour passer
buffer
par pointeur:Ou par référence, qui est le c++ et est moins sujette aux erreurs: