【发布时间】:2013-10-18 13:41:29
【问题描述】:
给定以下 sn-p,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() 有关吗?
【问题讨论】:
-
为什么不直接使用
fread和fwrite? -
您似乎误解了文件 I/O,在您的情况下不需要 fseek,尤其是在您以文本模式打开文件时。
-
您的 fopen() 分别使用“r”和“w”。默认为文本模式,二进制模式使用“rb”和“wb”
-
那么当你不是指“随机”时,请不要声称“随机”。说“计算”之类的。
fgetc()和fputc()函数与计算中的任何事物一样接近 100% 可靠。问题出在您的代码中。我们的问题是我们还不能确切地看到您的代码是什么。我们需要 SSCCE (Short, Self-Contained, Correct Example) 和您使用的确切数据,以便我们可以尝试重现您的问题,并尝试了解问题所在。我们可以做出猜测,但仅此而已,因为我们不知道您的期望或真正拥有什么。 -
@AndreyT:C 标准(ISO/IEC 9899:2011 §7.21.9.2
fseek函数)指出:对于文本流,偏移量应为零,或偏移量应为先前成功调用与同一文件关联的流上的ftell函数返回的值,并且应为 SEEK_SET。 实际上,这就是最小公分母规则。基于 Unix 的系统更灵活,允许对文本文件进行与对二进制文件相同的操作。当然,该平台尚未说明。