【问题标题】:Reasons why fgetc() and/or fputc() is inconsistent [closed]fgetc() 和/或 fputc() 不一致的原因 [关闭]
【发布时间】: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() 有关吗?

【问题讨论】:

  • 为什么不直接使用freadfwrite
  • 您似乎误解了文件 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 的系统更灵活,允许对文本文件进行与对二进制文件相同的操作。当然,该平台尚未说明。

标签: c file-io stream


【解决方案1】:

这里有几件事我不清楚。

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

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

fseek(fout, 1, SEEK_CUR);

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

【讨论】:

  • 以上是sn-p。在我的应用程序中,我使用fseek 转到特定的块地址。
  • 您每次都在通过for (k 循环执行此操作。这与去特定的区块地址有什么关系?
  • 再一次,上面是我正在做的一个示例 sn-p。
  • @edmastermind29 对于每一个字节?您是否将每个字节存储在不同的块中?
  • @JoachimPileborg 是的。取决于命令。
【解决方案2】:

我会这样做:

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);
    }
}

【讨论】:

    猜你喜欢
    • 2016-05-23
    • 1970-01-01
    • 1970-01-01
    • 2015-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多