鉴于以下代码段,fin
包含data
的随机文字,始终跟随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()
有关?
答案 0 :(得分:2)
我在这里不清楚一些事情。
while ((ch = fgetc(fin)) != EOF)
你打算扔掉刚读过的角色吗?
fseek(fout, 1, SEEK_CUR);
为什么你跳过一个字节?写入将自动推进文件。我认为你不想两次推进文件位置。
答案 1 :(得分:0)
我会做这样的事情:
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);
}
}