C 中的
fgetc
函数应该只读取字符,但在此代码中读取多个字符。
在此代码中,我测试函数
fseek
来移动光标并使用函数 fgetc
每次获取下一个字符。我将其应用于包含从 1 到 19 的数字的文件。但是当我尝试读取数字 11 中的第一个 1 时,它读取的是 12,我不明白为什么会发生这种情况。
#include <stdio.h>
#include <stdlib.h>
#define BLOCK_SIZE 20
int main() {
int i;
FILE *file;
char buffer[BLOCK_SIZE];
int returnCode;
int value;
// Open or create the binary file for writing
file = fopen("data.bin", "wb");
if (file == NULL) {
perror("Error opening file");
return 1;
}
// Fill the buffer with consecutive values from 0 to 19
for (i = 0; i < BLOCK_SIZE; i++) {
buffer[i] = i;
}
// Write the entire buffer to the file
fwrite(buffer, BLOCK_SIZE, 1, file);
// Close the file
fclose(file);
// Open the file for reading in binary mode
file = fopen("data.bin", "rb");
if (file == NULL) {
perror("Error opening file");
return 1;
}
// Move the file cursor to the 5th byte from the beginning
returnCode = fseek(file, 5, SEEK_SET);
if (returnCode != 0) {
printf("Changement de position impossible\n");
fclose(file);
exit(EXIT_FAILURE);
}
// Read the byte at the current cursor position
value = fgetc(file);
printf("Le 5eme octet allant du debut est %d\n", value);
// Read the next byte after the current cursor position
value = fgetc(file);
printf("L'octet suivant est %d\n", value);
// Move the file cursor 5 bytes forward from the current position
returnCode = fseek(file, 5, SEEK_CUR);
value = fgetc(file);
printf("Octet 5 positions plus loin de la position actuelle est %d\n", value);
// Move the file cursor 5 bytes backward from the end of the file
returnCode = fseek(file, -5, SEEK_END);
value = fgetc(file);
printf("5eme octet à partir de la fin est %d\n", value);
// Close the file
fclose(file);
return 0;
}
您说:**我将此应用于包含从 1 到 19 的数字的文件**。这是不对的。文件包含从 0 到 19 的数字。
这是
hexdump
的 data.bin
:
[gmt@arch ~]$ hexdump -X data.bin
0000000 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f
0000010 10 11 12 13
0000014
打开文件进行读取后,初始它位于位置 0(我将使用 0 索引编号)。所以你寻找它 5 个字节,那么位置是 5(第 6 个字节)并且读取这个位置的字符一定会得到
5
并且没问题。
returnCode = fseek(file, 5, SEEK_SET);
if (returnCode != 0) {
printf("Changement de position impossible\n");
fclose(file);
exit(EXIT_FAILURE);
}
// Read the byte at the current cursor position
value = fgetc(file);
printf("Le 5eme octet allant du debut est %d\n", value);
结果:
Le 5eme octet allant du debut est 5
。
接下来你会得到另一个字符(索引=6或第7个字符),它一定是
6
:
// Read the next byte after the current cursor position
value = fgetc(file);
printf("L'octet suivant est %d\n", value);
现在文件位于索引=7(第8个位置),所以在你寻找它5个位置后,它必须位于索引=12(或第13个位置)并且它必须读取
12
:
// Move the file cursor 5 bytes forward from the current position
returnCode = fseek(file, 5, SEEK_CUR);
value = fgetc(file);
printf("Octet 5 positions plus loin de la position actuelle est %d\n", value);
结果:
Octet 5 positions plus loin de la position actuelle est 12
。
最后从末尾 5 个位置向后查找文件。它是 20 字节文件,其最后一个字符索引为 19。因此,seek -5 表示索引=14(或第 15 个字符)。所以阅读它一定会得到
0x0f
或 15
,也没关系。
// Move the file cursor 5 bytes backward from the end of the file
returnCode = fseek(file, -5, SEEK_END);
value = fgetc(file);
printf("5eme octet à partir de la fin est %d\n", value);
结果:
5eme octet à partir de la fin est 15