À l'aide de fread() pour lire un fichier de texte dans un tampon - pourquoi les valeurs dans la mémoire tampon pas de chaque personnage respectif valeur ASCII?
Tout d'abord, ce n'est pas de devoirs. Juste essayer de comprendre pourquoi je vais voir ce que je vois sur mon écran.
Les trucs ci-dessous (mon propre travail) prend actuellement un fichier d'entrée et le lit dans un fichier binaire. Je le veux pour stocker chaque octet lu dans un tableau (pour plus tard). Par souci de concision, le fichier d'entrée Hello.txt) contient simplement 'Bonjour le Monde', sans les apostrophes.
int main(int argc, char *argv[]) {
FILE *input;
int i, size;
int *array;
input = fopen("Hello.txt", "rb");
if (input == NULL) {
perror("Invalid file specified.");
exit(-1);
}
fseek(input, 0, SEEK_END);
size = ftell(input);
fseek(input, 0, SEEK_SET);
array = (int*) malloc(size * sizeof(int));
if (array == NULL) {
perror("Could not allocate array.");
exit(-1);
}
else {
input = fopen("Hello.txt", "rb");
fread(array, sizeof(int), size, input);
//some check on return value of fread?
fclose(input);
}
for (i = 0; i < size; i++) {
printf("array[%d] == %d\n", i, array[i]);
}
Pourquoi est-ce que le fait d'avoir l'impression d'instruction dans la boucle for comme il est ci-dessus les causes de la sortie de ressembler à ce
array[0] == 1819043144
array[1] == 1867980911
array[2] == 6581362
array[3] == 0
array[4] == 0
array[5] == 0
array[6] == 0
array[7] == 0
array[8] == 0
array[9] == 0
array[10] == 0
tout en ayant comme ça
printf("array[%d] == %d\n", i, ((char *)array)[i]);
rend la sortie ressemble à ceci (décimal valeur ASCII de chaque caractère)
array[0] == 72
array[1] == 101
array[2] == 108
array[3] == 108
array[4] == 111
array[5] == 32
array[6] == 87
array[7] == 111
array[8] == 114
array[9] == 108
array[10] == 100
? Si je suis en train de lire comme un fichier binaire et que vous voulez lire octet par octet, pourquoi ne reçois-je pas le droit, valeur ASCII à l'aide de l'impression de la première déclaration?
Sur une note connexe, ce qui se produit si le fichier d'entrée j'envoie n'est pas un document texte (par exemple, jpeg)?
Est désolé c'est tout à fait trivial, mais je n'arrive pas à comprendre pourquoi.
- Pourquoi êtes-vous de l'ouverture du fichier d'entrée deux fois?
- Parce que je viens de remarquer que j'ai fait aaaaand je l'ai supprimé. Merci!
Vous devez vous connecter pour publier un commentaire.
Le comportement n'est pas surprenant:
sizeof(char)
est 1.int
avec 11 int.sizeof(int)
est très susceptible d'être 4 sur votre machinefread
lire jusqu'à 11int
s (jusqu'à 44 octets). Donc les 4 premiers caractères seront lus comme unint
et stockées dansarray[0]
et 4 dansarray[1]
.fread
il vous dira qu'il fait seulement lire les 2 éléments (comme le contenu est de 11 octets, il ne peut que lire 2int
s et les 3 derniers octets restants ne peuvent pas être lu comme uneint
).int
vous obtenez construire par les 4 premiers caractères.La disposition de la mémoire ressemble fondamentalement ceci:
ReadBuffer[/*output of fread*/] = 0;
était le truc pour moi. Commentaires pour ceux qui ont un problème similaire.Votre ftell retourne la valeur courante de l'indicateur de position du flux.
Et il renvoie le nombre d'octets du fichier. Et vous êtes la lecture de fichiers comme la séquence de l'int de 4 octets et bien sûr le plus tard élément sera de 0.
Pour plus de détails, vous lisez 4 x taille octets à partir d'un fichier dont la taille octets.
Votre tableau devrait être un type de char.
Quelque chose comme
Juste l'idée, pas le code. Espérons que cette aide;