哪位老大帮看看,问题出在哪?

时间:2022-03-28 21:22:44
把程序从unix上移植到windows上时,发现读、写文件的模块总出莫名的错误,于是写了个测试程序,真的有想像不到的结果,在我的笔记本和台式机上执行了,都得不到想要的结果,测试程序如下,编译环境为dev-cpp,预想的执行结果应该是2586,可实际的执行结果是658714,怀疑是文件缓存的问题。哪位老大帮看看,问题出在哪儿?分不够还可以再加!
#include "stdio.h"
#include <fcntl.h>
main()
{
  int fd;
  int size;
  int i;
  fd = open("c:\\tmp\\w9.dbf",O_CREAT|O_RDWR,00777);
  for (i=0;i<600;i++)
  {
    int wd;
    lseek(fd,i*sizeof(int),SEEK_SET);
    if (537 == i ) wd=2586;
    else wd = i;
    write(fd,&wd,sizeof(int));
  }
  lseek(fd,537*sizeof(int),SEEK_SET);
  read(fd,&size,sizeof(int));
  printf("size:%d \n",size);
  close(fd);
}

10 个解决方案

#1


size:2090030679

我的结果……gcc 4.4.3 codeblocks

#2


调整了文件路径后和你一样……怪事,换C标准库试试,这个程序没有一定要用系统调用的需求吧

#3


我跟踪了一下程序,实际上在read(fd,&size,sizeof(int));这句读出的字节数为0,换成2586以外的数据就正确性,真TM的邪门儿了。

#4


开始用fstream,ACE_FILE等,发现结果不对才用低层的,结果还是不对。

#5


换C标准库是对的,Windows下还是用标准库吧



#include <stdio.h>
int main()
{
FILE* fd = 0;
int size = 0;
int i = 0;
fd = fopen("c:\\tmp\\w9.dbf","wb+");
for (i=0;i<600;i++)
{
int wd;
fseek(fd,i*sizeof(int),SEEK_SET);
if (537 == i ) wd=2586;
else wd = i;
fwrite(&wd,sizeof(int),1,fd);
}
fseek(fd,537*sizeof(int),SEEK_SET);
fread(&size,sizeof(int),1,fd);
printf("size:%d \n",size);
fclose(fd);
}

#6


该回复于2010-08-16 10:16:35被版主删除

#7


将 int 换为 unsigned int 会表示更大的数值。 

#8


编译环境为dev-cpp,这个软件一直在改进状态,它只适合初学者,不适合应用开发。个人见解。

建议你采用操作系统(或者一个成熟软件包)标准开发库上,不值得把时间浪费在使用测试版本软件这个这些环节上。

我们开发环节,一般都用正式发布版的gcc(glibc采用发布版)和vs开发工具。如果出现软件包的问题,一般都可以在官方网站上查到相关的FAQ。

#9


可能是两个平台对于范围的理解不一样

#10


至今未能找到正确的解释,用标准库确实能得到正确的结果。其实标准库最终也是用的低层函数。之所以正确是因为fread 带缓冲的缘故吧。如果自己定义缓冲,用read 也能得出正确结果。
不管怎么说,先结贴吧。

#1


size:2090030679

我的结果……gcc 4.4.3 codeblocks

#2


调整了文件路径后和你一样……怪事,换C标准库试试,这个程序没有一定要用系统调用的需求吧

#3


我跟踪了一下程序,实际上在read(fd,&size,sizeof(int));这句读出的字节数为0,换成2586以外的数据就正确性,真TM的邪门儿了。

#4


开始用fstream,ACE_FILE等,发现结果不对才用低层的,结果还是不对。

#5


换C标准库是对的,Windows下还是用标准库吧



#include <stdio.h>
int main()
{
FILE* fd = 0;
int size = 0;
int i = 0;
fd = fopen("c:\\tmp\\w9.dbf","wb+");
for (i=0;i<600;i++)
{
int wd;
fseek(fd,i*sizeof(int),SEEK_SET);
if (537 == i ) wd=2586;
else wd = i;
fwrite(&wd,sizeof(int),1,fd);
}
fseek(fd,537*sizeof(int),SEEK_SET);
fread(&size,sizeof(int),1,fd);
printf("size:%d \n",size);
fclose(fd);
}

#6


该回复于2010-08-16 10:16:35被版主删除

#7


将 int 换为 unsigned int 会表示更大的数值。 

#8


编译环境为dev-cpp,这个软件一直在改进状态,它只适合初学者,不适合应用开发。个人见解。

建议你采用操作系统(或者一个成熟软件包)标准开发库上,不值得把时间浪费在使用测试版本软件这个这些环节上。

我们开发环节,一般都用正式发布版的gcc(glibc采用发布版)和vs开发工具。如果出现软件包的问题,一般都可以在官方网站上查到相关的FAQ。

#9


可能是两个平台对于范围的理解不一样

#10


至今未能找到正确的解释,用标准库确实能得到正确的结果。其实标准库最终也是用的低层函数。之所以正确是因为fread 带缓冲的缘故吧。如果自己定义缓冲,用read 也能得出正确结果。
不管怎么说,先结贴吧。