0

给定以下代码段,fin其中包含data始终遵循 a的随机文本command

#define COMMANDSIZE 16
#define DATASIZE 128

int i, j, k, ch;

char command[COMMANDSIZE];
char data[DATASIZE];

FILE* fin;
FILE* fout;

fin = fopen("input.txt", "r");
fout = fopen("output.txt", "w");

fseek(fout, 0, SEEK_SET);

while ((ch = fgetc(fin)) != EOF)
{
    for (i = 0; i < sizeof(command); i++) //obtain command from input stream
    {
         command[i] = fgetc(fin) & 0xff;
    }

    for (j = 0; j < sizeof(data); j++) //obtain data from input stream
    {
         data[j] = fgetc(fin) & 0xff;
    }

    for (k = 0; k < sizeof(data); k++) //write data to output stream
    {
         fseek(fout, /* computed block address */, SEEK_CUR);
         fputc(data[k], fout);
    }
}

fclose(fout);
fclose(fin);

比较输入和输出文件,输入文件中的一些数据没有结转。因此,我尝试使用 进行上述while(1)操作,并且输入文件中的某些数据没有结转,但它与使用的数据while((ch = fgetc(fin)) != EOF)不同,并且不同的输出文件之间没有相交(某些重叠)。

如何确保输入文件中的所有数据都写入输出文件?这与fgetc()和/或有关fputc()吗?

4

2 回答 2

2

这里有几件事我不清楚。

while ((ch = fgetc(fin)) != EOF)

你打算扔掉你刚刚读到的角色吗?

fseek(fout, 1, SEEK_CUR);

为什么要向前跳过一个字节?写入将自动推进文件。我认为您不想将文件位置提高两次。

于 2013-10-18T13:49:48.943 回答
0

I would do something like this instead:

char command[COMMANDSIZE];
char data[DATASIZE];

FILE* fin;
FILE* fout;

fin = fopen("input.txt", "rb");
fout = fopen("output.txt", "wb");

while (fread(command, sizeof(command), 1, fin) != EOF)
{
    if (fread(data, sizeof(data), 1, fin) != EOF)
    {
        fseek(...);  /* Seek to the block where current data should be written */
        fwrite(data, sizeof(data), 1, fout);
    }
}
于 2013-10-18T13:55:35.683 回答