关于open

kiddy1010 2009-12-03 11:12:48
在linux下,有以下函数,open lseek read 都正常,但是读出来的全部问零,(文件不为零)是在windows下产生的二进制文件!
**********************************************
* data_read
*
* input: addr: flash read address
* count: flash read count unit is byte
* buffer: flash read data buffer
*
* return: nagative int: please refer system call read
* 0 : init read failed
* others : read cout unit is byte
*
* ********************************************/
size_t data_read(void *addr, size_t count, void *buffer)
{
int fd;
off_t read_off;
if(!file2flash_inited)
{
file2flasherror("mtd not be mounted \n");
return 0;
}
if(buffer == NULL)
{
file2flasherror("return buffer is NULL \n");
return 0;
}
if( ((u_int32)addr < FLASH_START_ADDR) ||
((u_int32)addr >= ( FLASH_START_ADDR + FLASH_SIZE) ) )
{
file2flasherror("flash address %p beyond flash region", addr);
return 0;
}
read_off = (unsigned int)(addr) - FLASH_START_ADDR;
fd = open(flashfilename, O_RDONLY , S_IRUSR);//| O_CREAT
if (fd != 0)
{
off_t offset;
ssize_t readlen;

offset = lseek(fd, read_off, SEEK_SET);
if(offset != read_off)
{
file2flasherror("read lseek to %d failed \n", read_off);
close(fd);
return 0;
}
count = (count > (FLASH_SIZE - read_off)) ? (FLASH_SIZE - read_off) : count;
readlen = read(fd, buffer, count);
if (readlen >= 0)
/* some data has been read */
{
/* all no read buffer fill with 0xff */
memset((char *)buffer + readlen , 0xFF, count - readlen);
/* if read some data, always regard as read count bytes */
readlen = count;
}
close(fd);
return readlen;
}
else
{
file2flasherror("flash read open file %s failed \n", flashfilename);
return 0;
}
} /* end of data read */
有谁能帮忙看看!
...全文
159 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
armjishu123 2009-12-04
  • 打赏
  • 举报
回复
1.open lseek read 都正常,但是读出来的全部问零
答:如果open lseek read正常,那证明被读文件格式有问题

2.你写OPEN这个WINDOWS被读文件,然后在首位写入几个字符,然后你再读出并打印,看是否能重新读出并打印出你写入的字符

3.如果可以,就怀疑是不是WINDOWS二进制编码的问题了,因为open lseek read 这些都是系统调用,这些实际上也是由C语言实现的,例如:如果遇到/n这个字符,read()函数就认为该文件已经结束了,所以有可能是WINDOWS那个文件一开始就是这种字符,造成了read()函数返回文件为0的假像。

再有问题,可以找我 http://hi.csdn.net/armjishu123
独孤过儿 2009-12-03
  • 打赏
  • 举报
回复
跟编译器有关,这种直接写二进制的文件,在跨平台的时候经常出现问题。因为MS的编译器和gcc的编译器很可能

内部的机制不一样,比如对齐;这样在windows上生成的二进制文件,到linux下读取的时候就出问题了

建议你在linux下先写一个,然后再读一次试试看。如果没问题,那就可以确定是跨平台以及跨编译器引起的问

题了
yanjingfei 2009-12-03
  • 打赏
  • 举报
回复
文件格式不兼容,可能读出来的有问题吧。
kiddy1010 2009-12-03
  • 打赏
  • 举报
回复
在线等。。。。。

23,216

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧