1

我正在使用 C,我想从 binaryFile 中读取。

我知道它以以下方式包含字符串:字符串的长度,字符串本身,字符串的长度,字符串本身,等等......

我想计算字符串 Str 在二进制文件中出现的次数。

所以我想做这样的事情:

int N;
while (!feof(file)){
    if (fread(&N, sizeof(int), 1, file)==1)
        ...

现在我需要获取字符串本身。我知道它的长度。我应该做一个'for'循环并用fgetc char by char吗?我知道我不允许使用 fscanf,因为它不是文本文件,但我可以使用 fgetc 吗?我会得到我对我的字符串的期望吗?(要对 char* 使用长度大小的动态分配并使用 strcpy 将其添加到当前字符串?)

4

2 回答 2

5

您可以将一些内存分配mallocfread该缓冲区中:

char *str;

/* ... */
if (fread(&N, sizeof(int), 1, file)==1)
{
    /* check that N > 0 */
    str = malloc(N+1);
    if (fread(str, sizeof(char), N, file) == N)
    {
        str[N] = '\0'; /* terminate str */
        printf("Read %d chars: %s\n", N, str);
    }

    free(str);
}
于 2012-07-19T15:37:56.670 回答
4

你可能应该循环:

while (fread(&N, sizeof(int), 1, file) == 1)
{
    // Check N for sanity
    char *buffer = malloc(N+1);
    // Check malloc succeeded
    if (fread(buffer, N, 1, file) != 1)
        ...process error...
    buffer[N] = '\0';  // Null terminate for sanity's sake
    ...store buffer (the pointer) for later processing so you aren't leaking...
    ...or free it if you won't need it later...
}

您可以在循环中使用getc()or ;fgetc()那行得通。然而,直接fread()更简单(并且被编码为好像getc()在循环中使用)。

N盲目地将它与malloc(). 特别是,消极的价值观可能会导致很多不快乐。

所编写的文件格式与一类机器相关联 - 大端或小端,并且具有固定大小int(可能是 32 位)。编写更便携的数据稍微复杂一些,但非常可行——但可能与你目前不相关。

使用feof()很少是测试是否继续循环的正确方法。实际上,通常不需要feof()在代码中使用。使用它时,这是因为 I/O 操作“失败”,您需要区分“这不是错误 - 只是 EOF”和“设备上出现某种错误”。

于 2012-07-19T15:38:57.543 回答