C系统调用 - 继续使用lseek和读取错误

时间:2015-03-22 04:51:28

标签: c unix system

这是我正在上课的练习练习,我不明白为什么会这样做...

尝试从变量(num2)分配长度为char数组(缓冲区)时遇到问题。

您可以像这样执行文件:

./file.c offset numOfChars filename.txt

./file.c 4 10 somefile.txt

如果somefile包含文本:

  

为什么这个c程序不起作用。我无法弄清楚

程序应该打印

  

不是这个

以下是代码:

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>

main(int ac, char *av[]){
    // Save the command line variables
    int num1 = av[1];
    int num2 = av[2];

    long numbyte1 = av[1];
    long numbyte2 = av[2];

    int fd = open(av[3], O_RDONLY);

    // Try to open the file
    if( fd < 0 )
        perror(fd + " - Could not open file!");

    // use stat to get file size
    struct stat sb;
    if(fstat(fd,&sb) < 0)    
        return 1;

    // Check to see if the file is big enough for the provided offset
    if(sb.st_size < num1+num2){
        perror(fd + " - Size of file is not large enough for provided offset!" + fd);
    }

    char buffer[num2];

    if(lseek(fd, numbyte1 ,SEEK_SET) < 0) return 1;

    if(read(fd, buffer, numbyte2) != numbyte2) return 1;

    printf("%s\n", buffer);

    return 0;
}

1 个答案:

答案 0 :(得分:1)

我看到的问题:

  1. ./file.c不是运行该程序的正确方法。您需要编译程序并创建可执行文件。然后,你可以运行它。

    如果您有gcc,请使用:

     
    gcc -o file -Wall file.c
    ./file 4 10 somefile.txt
    
  2. 这些行

    int num1 = av[1];
    int num2 = av[2];
    

    不对。编译器应报告警告。使用gcc,我得到以下两行警告:

    soc.c: In function ‘main’:
    soc.c:4:15: warning: initialization makes integer from pointer without a cast [enabled by default]
    int num1 = av[1];
               ^
    soc.c:5:15: warning: initialization makes integer from pointer without a cast [enabled by default]
    int num2 = av[2];
    

    av[1]av[2]属于char*类型。如果包含整数,则可以使用标准库中的多个函数之一从中提取整数。 E.g。

    int num1 = atoi(av[1]);
    int num2 = atoi(av[2]);
    
  3. long numbyte1 = av[1];
    long numbyte2 = av[2];
    

    遇到同样的问题。您可以使用已提取的数字来{im} numbypte1numbypte2

    long numbyte1 = num1;
    long numbyte2 = num2;
    
  4. 你有

    char buffer[num2];
    

    这不足以容纳包含num2个字符的字符串。您需要数组中的另一个元素来保存终止空字符。使用:

    char buffer[num2+1];
    
  5. 从文件中读取数据后,向buffer添加一个终止空字符。

    if(read(fd, buffer, numbyte2) != numbyte2) return 1;
    buffer[num2] = '\0';