C 计算从读取操作返回的字节

C 计算从读取操作返回的字节,c,debugging,unix,gdb,C,Debugging,Unix,Gdb,我有一个程序可以读取STDIO_FILENO。输入源是一个包含15个整数的txt文件。调用read并将返回值存储在n中之后。我用gdb打印n检查它。Gdb告诉我read返回了45个字节。我希望基于(32位x15)/8的60字节。有人能解释一下我在哪里算错了吗 #define BUFFSIZE 4096 int main(int argc, char * argv[]) { int n; char buf[BUFFSIZE]; while((n = read(STDIN

我有一个程序可以读取STDIO_FILENO。输入源是一个包含15个整数的txt文件。调用read并将返回值存储在n中之后。我用gdb打印n检查它。Gdb告诉我read返回了45个字节。我希望基于(32位x15)/8的60字节。有人能解释一下我在哪里算错了吗

#define BUFFSIZE 4096

int main(int argc, char * argv[])
{
    int n;
    char buf[BUFFSIZE];

    while((n = read(STDIN_FILENO, buf, BUFFSIZE)) > 0)
        if(write(STDOUT_FILENO, buf, n) != n)
            err_sys("write error");

    if(n < 0)
        err_sys("read error");

    exit(0);
}


Breakpoint 1, main (argc=1, argv=0x7fff5fbffb38) at stdin_stdout.c:10
10      while((n = read(STDIN_FILENO, buf, BUFFSIZE)) > 0)
(gdb) print n
$1 = 0
(gdb) n

Breakpoint 2, main (argc=1, argv=0x7fff5fbffb38) at stdin_stdout.c:11
11          if(write(STDOUT_FILENO, buf, n) != n)
(gdb) print n
$2 = 45
#定义BUFFSIZE 4096
int main(int argc,char*argv[])
{
int n;
字符buf[BUFFSIZE];
而((n=读取(标准文件号、buf、BUFFSIZE))>0)
if(写入(标准文件号,buf,n)!=n)
err_sys(“写入错误”);
if(n<0)
错误系统(“读取错误”);
出口(0);
}
断点1,位于标准输入端的main(argc=1,argv=0x7fff5fbffb38)。c:10
10而((n=读取(标准文件号、buf、BUFFSIZE))>0)
(gdb)打印
$1 = 0
(gdb)n
断点2,标准输入端c处的主断点(argc=1,argv=0x7fff5fbffb38):11
11如果(写入(标准文件号,buf,n)!=n)
(gdb)打印
$2 = 45

您将数字与数字表示混淆。因为这是一个文本文件,所以它包含文本,而不是整数


例如,您可以将文本“12 32”转换为整数12和整数32,但您必须这样做。你必须使用基数10,并且你必须同意用空格分隔整数。如果每个字符为一个字节,则文本将为五个字节。如果需要,可以将其转换为8个字节(两个32位整数)。但这种转换实际上必须完成,它本身不能完成。

我记得你说过它是一个文本文件。如果是这样,“32位”从何而来?而且,非常非常精确地说,如果它是一个文本文件,它包含数字和空格,而不是整数。15是整数,而包含“15”的文本文件包含两个符号,一个“1”数字后跟一个“5”数字。它实际上并不包含整数十五,而是两个数字,如果解释为十进制,则可以解释为数字十五?这个例子来自我正在学习的一本UNIX编程书。它是一个文本文件还是一个包含多字节整数的文件?整数15和数字“1”后接数字“5”之间存在差异。一个是整数,另一个是两个符号,如果您决定在基数10中解释它们,则可以将其解释为整数。