这是我正在上课的练习练习,我不明白为什么会这样做...
尝试从变量(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;
}
答案 0 :(得分:1)
我看到的问题:
./file.c
不是运行该程序的正确方法。您需要编译程序并创建可执行文件。然后,你可以运行它。
如果您有gcc
,请使用:
gcc -o file -Wall file.c
./file 4 10 somefile.txt
这些行
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]);
行
long numbyte1 = av[1];
long numbyte2 = av[2];
遇到同样的问题。您可以使用已提取的数字来{im} numbypte1
和numbypte2
long numbyte1 = num1;
long numbyte2 = num2;
你有
char buffer[num2];
这不足以容纳包含num2
个字符的字符串。您需要数组中的另一个元素来保存终止空字符。使用:
char buffer[num2+1];
从文件中读取数据后,向buffer
添加一个终止空字符。
if(read(fd, buffer, numbyte2) != numbyte2) return 1;
buffer[num2] = '\0';