gpt4 book ai didi

C 二进制读写文件

转载 作者:行者123 更新时间:2023-11-30 21:19:17 26 4
gpt4 key购买 nike

我正在使用二进制文件读取整数数组,然后每个偶数整数 x 应变为 2 * x,每个奇数整数 x 应变为 3 * x。当我这样做时,它总是读取第二个整数(即 2)。有什么想法吗?

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
FILE *f;

f = fopen("inputData.txt", "w+b");
int n = 5;
int i;
for (i = 1; i <= n; ++i) {
fwrite(&i, sizeof(int), 1, f);
}
int x;
fseek(f, 0, SEEK_SET);
while (fread(&x, sizeof(int), 1, f) == 1) {
printf("%d ", x);
if (x % 2 == 0) {
fseek(f, -sizeof(int), SEEK_CUR);
x = x * 2;
fwrite(&x, sizeof(int), 1, f);
} else {
fseek(f, -sizeof(int), SEEK_CUR);
x = 3 * x;
fwrite(&x, sizeof(int), 1, f);
}
}

fclose(f);
}

最佳答案

好吧,我不太明白发生了什么,但在这种情况下与读/写文件一起使用时,您似乎不能信任 fseekSEEK_CUR (我运行的是 Windows,众所周知,标准功能与 Linux 不同,这可能是问题所在)

编辑:Andrew's answer证实了我的怀疑。我的解决方案符合标准建议。

为了解决该问题,我所做的就是自己管理文件位置并寻找该位置,而不是在调用 fseek 时隐式依赖当前文件位置。

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
FILE *f;

f = fopen("inputData.txt", "w+b");
if (!f) { perror("cannot create input"); exit(1); }

int n = 5;
int i;
for (i = 1; i <= n; ++i) {
fwrite(&i, sizeof(int), 1, f);
}


int x;
int pos=0;
fseek(f, 0, SEEK_SET);
while (fread(&x, sizeof(int), 1, f) == 1) {
if (fseek(f, pos, SEEK_SET)) {perror("cannot seek");exit(1);}
pos += sizeof(int);
printf("%d %lu\n", x, ftell(f));
if (x % 2 == 0) {
x = x * 2;
} else {
x = 3 * x;
}
if (fwrite(&x, sizeof(int), 1, f) != 1) {perror("cannot write");exit(1);}
if (fseek(f, pos, SEEK_SET)) {perror("cannot seek");exit(1);}
}

fclose(f);
}

现在程序的输出是(带有当前偏移量)

1 0
2 4
3 8
4 12
5 16

二进制文件的内容现在是(正如在小端架构上所预期的那样):

03 00 00 00 04 00 00 00 09 00 00 00 08 00 00 00 0F 00 00 00

所以这是一个解决方法,但至少它可以正常工作。

关于C 二进制读写文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53344969/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com