如何从文件中的特定字符开始读取?
How to read from a specific character onwards within a file?
我有一个文件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。
如果您知道偏移量(例如:您正在跳过标准 header 等),那么您应该使用 fseek
将文件中的指针移动到正确的位置。
如果您不知道偏移量,那么您必须自己找到它 - 读取文件直到循环到达您想要的位置,然后在到达那里后调用该函数(您可能需要用fseek
后退一位)。
fseek
是您要查找的内容:
https://www.tutorialspoint.com/c_standard_library/c_function_fseek.htm
使用 fseek
如果知道偏移量,您可以将文件指针移动到正确的位置。
否则,在使用 fgetc
.
从流中消费时,您将不得不循环到正确的字符
一般来说,您有两种选择来解决这个问题:
循环读取所有带fgetc
的字节,直到遇到值为0xD3
的字节。
如果您知道值为 0xD3
的字节的偏移量,请使用函数 fseek
.
直接跳转到该偏移量
但是,选项 #2 存在以下问题:
在 ISO C 中,调用 fopen
with the mode argument "r"
will open the file in text mode. In that mode, you are only allowed to pass offset values previously returned by the function ftell
。您不能简单地传递偏移值 4
.
但是,在您的情况下,由于输入文件似乎是二进制文件,因此通过将 "rb"
作为模式参数传递,以二进制模式而不是文本模式打开文件可能会更好至 fopen
。这样,您可以简单地将偏移量 4
传递给 fseek
.
注意一些操作系统如Linux不区分文本模式和二进制模式。使用此类操作系统时,即使您使用 "r"
.
模式打开文件,您也可以简单地将偏移量 4
传递给 fseek
我有一个文件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。
如果您知道偏移量(例如:您正在跳过标准 header 等),那么您应该使用 fseek
将文件中的指针移动到正确的位置。
如果您不知道偏移量,那么您必须自己找到它 - 读取文件直到循环到达您想要的位置,然后在到达那里后调用该函数(您可能需要用fseek
后退一位)。
fseek
是您要查找的内容:
https://www.tutorialspoint.com/c_standard_library/c_function_fseek.htm
使用 fseek
如果知道偏移量,您可以将文件指针移动到正确的位置。
否则,在使用 fgetc
.
一般来说,您有两种选择来解决这个问题:
循环读取所有带
fgetc
的字节,直到遇到值为0xD3
的字节。如果您知道值为
直接跳转到该偏移量0xD3
的字节的偏移量,请使用函数fseek
.
但是,选项 #2 存在以下问题:
在 ISO C 中,调用 fopen
with the mode argument "r"
will open the file in text mode. In that mode, you are only allowed to pass offset values previously returned by the function ftell
。您不能简单地传递偏移值 4
.
但是,在您的情况下,由于输入文件似乎是二进制文件,因此通过将 "rb"
作为模式参数传递,以二进制模式而不是文本模式打开文件可能会更好至 fopen
。这样,您可以简单地将偏移量 4
传递给 fseek
.
注意一些操作系统如Linux不区分文本模式和二进制模式。使用此类操作系统时,即使您使用 "r"
.
4
传递给 fseek