【问题标题】:How to read from a specific character onwards within a file?如何从文件中的特定字符开始读取?
【发布时间】:2022-02-01 08:36:44
【问题描述】:

我有一个文件RTCM3.bin。当我将此文件转换为十六进制字符时,我可以看到它的内容。例如: 0x3A, 0x00, 0x04, 0x10, 0xD3, 0x00, 0x95, 0x3E, 0xC0, 0x01, 0x49, 0x66, 0xA6, 0x42, 0x90, 0x09, 0x2E, 0x0D, 0x8E, 0x00, 0x30, 0x86, 0x14, 0x68, 0x70等等等等

问题是这个字符被传递给一个函数:

FILE *p;
p = fopen("./RTCM3.bin", "r");
int y = fgetc(p);
printf("First character in input to input_rtcm3f: %d\n", y); 
int x  = input_rtcm3f(&rtcm, p);
printf("Return value of input_rtcm3f: %d\n", x);

无论如何,我只需要为input_rtcm3 函数提供输入,只需要从 0xD3 开始的字符。在这种情况下:

`0xD3, 0x00, 0x95, 0x3E, 0xC0, 0x01, 0x49` etc. etc.

我该怎么做? y 是 0xD3 的整数值,即 211。所以,y 我认为应该是 211。

【问题讨论】:

  • 循环读取文件,直到得到0xd3。然后开始用字符调用input_rtcm3f()

标签: c file stream hex


【解决方案1】:

一般来说,解决这个问题有两种选择:

  1. 循环读取所有带有fgetc 的字节,直到遇到值为0xD3 的字节。

  2. 如果您知道值为0xD3 的字节的偏移量,请使用函数fseek 直接跳转到该偏移量。

但是,选项 #2 存在以下问题:

在 ISO C 中,使用模式参数 "r" 调用 fopen 将以文本模式打开文件。在该模式下,您只能传递函数ftell 先前返回的偏移值。您不能简单地传递偏移值4

但是,在您的情况下,由于输入文件似乎是二进制文件,因此最好以二进制模式而不是文本模式打开文件,方法是将 "rb" 作为模式参数传递给 fopen .这样,您可以简单地将偏移量4 传递给fseek

请注意,某些操作系统(例如 Linux)不区分文本模式和二进制模式。使用此类操作系统时,您只需将偏移量4 传递给fseek,即使您以"r" 模式打开文件。

【讨论】:

    【解决方案2】:

    fseek 是您要查找的内容: https://www.tutorialspoint.com/c_standard_library/c_function_fseek.htm

    使用fseek,如果您知道偏移量,您可以将文件指针移动到正确的位置。

    否则,您必须在使用fgetc 从流中消费时循环到正确的字符。

    【讨论】:

    • 没有。该文件已在文本模式下打开:p = fopen("./RTCM3.bin", "r");fseek() doesn't work that way for text streams:“对于文本流,偏移量应为零,或偏移量应为先前成功调用关联流上的 ftell 函数返回的值使用相同的文件,并且应该是 SEEK_SET。”
    • 我建议你改用this reference for the function fseek。特别是,您可能需要密切注意参考文档的这段段落:“如果流以文本模式打开,则唯一支持的偏移值是零(适用于任何来源)和一个较早的返回值在与同一文件关联的流上调用 ftell(仅适用于 SEEK_SET 的来源)。"
    【解决方案3】:

    如果您知道偏移量(例如:您正在跳过标准标题等),那么您应该使用fseek 将文件中的指针移动到正确的位置。

    如果您不知道偏移量,那么您必须自己找到它 - 读取文件直到您循环到达您想要的位置,然后在您到达那里后调用该函数(您可能需要使用fseek 向后移动一个位置)。

    【讨论】:

    • 根据§7.21.9.2 ¶4 of the ISO C11 standard,使用非零偏移量调用fseek 将对以文本模式打开的流调用未定义的行为,除非该偏移量是从先前对ftell 的调用中获得的。请注意,OP 是以文本模式打开文件,而不是二进制模式。因此,您的解决方案不可移植;它只保证在不区分文本模式和二进制模式的平台上工作(例如Linux)。另一方面,无论如何,OP 都应该以二进制模式打开文件。
    猜你喜欢
    • 1970-01-01
    • 2017-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-04
    • 1970-01-01
    相关资源
    最近更新 更多