fgetc 读取 C 中的文件

问题描述 投票:0回答:1

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;
}

这是输出: this the output of this code

c file-handling fseek fgetc
1个回答
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

© www.soinside.com 2019 - 2024. All rights reserved.