6

我正在尝试写出定义为的字符串的字节大小

#define PATHA "/tmp/matrix_a"

使用代码

rtn=write(data,(strlen(PATHA)*sizeof(char)),sizeof(int));
if(rtn < 0) 
    perror("Writing data_file 2 ");

我回来Writing data_file 2 : Bad address

这到底是一个坏地址?数据文件描述符已打开,并在上述代码段之前和之后正确写入。要写入文件的数据必须data是原始的,而不是 ASCII。

我也尝试将字符串定义为具有相同问题的 char[]

4

5 回答 5

4

POSIX 的论点write()是:

#include <unistd.h>

ssize_t write(int fildes, const void *buf, size_t nbyte);

那是一个:

  • 文件描述符
  • 缓冲
  • 尺寸

您传递了两种尺寸,而不是地址和尺寸。

利用:

rtn = write(data, PATHA, sizeof(PATHA)-1);

或者:

rtn = write(data, PATHA, strlen(PATHA));

如果您正在寻求将字符串的大小写为int,那么您需要一个int变量来传递给write(),如下所示:

int len = strlen(PATHA);

rtn = write(data, &len, sizeof(len));

请注意,您不能只使用size_t变量,除非您想编写size_t; 特别是在 64 位 Unix 系统上,sizeof(size_t) != sizeof(int)通常情况下,您需要确定要写入的大小。

您还需要注意,一些系统是小端的,而另一些是大端的,并且您在一种类型上使用这种机制编写的内容在另一种类型上是不可读的(在 I/O 之前或之后没有完成映射工作)操作)。您可能会选择忽略这个问题,或者您可能决定使用可移植格式(通常称为“网络顺序”,相当于大端),或者您可能决定定义您的代码使用相反的格式命令。如果您小心的话,您可以编写代码以便在所有平台上使用相同的逻辑(并且所有平台都会得到相同的答案)。

于 2012-12-05T22:40:15.673 回答
4

第二个参数write()是您要写入的字节的地址,但您传递的是您要自己写入的字节。为了获得地址,您必须将这些字节存储在变量中(您不能获取表达式结果的地址)。例如:

size_t patha_len = strlen(PATHA);

rtn = write(data, &patha_len, sizeof patha_len);
于 2012-12-05T23:48:42.630 回答
3

第二个参数write()是缓冲区,第三个参数是大小:

ssize_t write(int fd, const void *buf, size_t count);

发布的代码传递了被解释为不正确地址的长度。编译器应该对此发出警告(不要忽略编译器警告并以最高级别的警告级别进行编译)。

改成:

rtn=write(data, PATHA, strlen(PATHA));

注意sizeof(char)保证是1这样的,所以它可以从大小计算中省略。

于 2012-12-05T22:40:11.270 回答
2

Bad address错误已经得到解答。如果你想写一个字符串的大小,只需使用printf.

printf("Length: %d\n", strlen(data));

要么,或者您可以编写一个将整数转换为字符串并将其打印出来的函数......我更喜欢printf:)

于 2012-12-05T23:00:50.483 回答
1
rtn = write(data, PATHA, strlen(PATHA));

是你想要的,我想。争论应该是

  1. 文件描述符(数据)
  2. 源缓冲区(您的字符串常量 PATHA)
  3. 从该缓冲区中提取的字节数(在相同的 PATHA 常量上使用 strlen() 测量)

此外,为了完整起见,您应该始终检查 rtn 您写了多少个字符。您不能保证您 write() 所有描述符类型上请求的所有字节。因此,有时您最终会以块的形式编写它,这取决于它所回答的数量,以及您知道自己尚未编写的数量。

于 2012-12-05T22:45:57.287 回答