【发布时间】:2016-08-05 01:54:36
【问题描述】:
我有一些代码使用低级 i/o read 和 write 系统调用,如 C 编程语言书籍 Kernighan 和 Ritchie 的第 170 页所述。
函数原型是这样的
int n_read = read ( int fd, char *buf, int n )
int n_read = write ( int fd, char *buf, int n )
现在,使用这些 read 和 write 的两个 .c 文件被更大的基于 fortran 的程序调用以读取和写入大量数据。
C 代码就是这样,没有任何类型的#include,在函数名后面有下划线并通过引用传递:
int read_ ( int *descriptor, char *buffer, int *nbyte )
{
return ( read( *descriptor, buffer, *nbyte ) );
}
int write_ ( int *descriptor, char *buffer, int *nbyte )
{
return ( write( *descriptor, buffer, *nbyte ) );
}
更大的基于 fortran 的程序会做这样的事情
INTEGER nbyte
COMPLEX*16 matrix(*)
INTEGER READ, WRITE
EXTERNAL READ, WRITE
status = READ( fd, matrix, nbyte )
if ( status .eq. -1 ) then
CALL ERROR('C call read failure')
stop
endif
正如您可能已经猜到的那样,这适用于小于 2^31 的 nbyte 值。我需要读取超过 2 GB 的数据,所以我需要 nbyte 在 fortran 中成为 long integer 和 INTEGER*8。
是否有等价的 read64 和 write64,就像 unistd.h 和 features.h 提供的 lseek64 一样?
重新编码的最佳方法是什么?
我应该使用 fread 和 fwrite 吗?
来自低级write 的int fd 是否与来自fread() 的FILE *stream 相同?
我的要求是能够传递一个 8 字节的长整数,以允许最大 100 到 500 GB 的值或具有 12 位的整数,这都是 nbyte 的值p>
当前使用read 和write 被标识为“系统调用”,我得到了什么还是失去了什么?这是什么意思?
【问题讨论】:
-
小块连续读取直到全部读取怎么办?
-
K&R C 不是你现在应该学习的东西,除非你出于历史原因好奇。现在有很多东西是不受欢迎的、过时的或完全错误的。例如,如果您对
read()函数只有 RTFM,您就会找到 Leandros 给您的声明,并且可能自己解决了您的问题。 -
这充其量只是一个丑陋的解决方法,@WeatherVane。如果 Fortran 端无法与 C 代码接口,仍然需要牢记这一点。
-
有关库函数的最新信息,请打开终端窗口,然后使用
man命令。例如,man 2 read告诉您有关read函数的所有信息。数字 2 表示手册中的部分。第 1 节主要是 shell 命令。第 2 节和第 3 节有 C 库函数。
标签: c