系统调用open()

时间:2015-03-30 03:35:02

标签: c system-calls

我试图通过系统调用获取txt文件的内容,但是当我的程序再次调用open()函数时,缓冲区会获得奇怪的数据。

void delFunction(){
int BUF_SIZE=8192;
int line=0,cont=0,x=0,y=0;
char buf[BUF_SIZE];
char buf2[BUF_SIZE];
char buf3[BUF_SIZE];
fflush(stdin);
int filedesc = open("testfile.txt", O_RDONLY);
read(filedesc, &buf, BUF_SIZE);
close(filedesc);
printf("BUFFER: \n");
puts(buf);
printf("Choose the line you want delete\n");
scanf("%d",&line);

for(x=0;x<strlen(buf);x++){
    if(line==cont){
    }else{
        buf2[y]=buf[x];
        y++;`
    }
    if(buf[x]=='\n'){
        puts(buf2);
        cont++;
    }
}
int filedesc2 = open("testfile.txt", O_WRONLY | O_TRUNC);
write(filedesc2,buf2, strlen(buf2));
close(filedesc2);
buf2[0]='\0';

}

第一次程序运行良好,但第二次缓冲区得到.txt内容加上错误的数据

1 个答案:

答案 0 :(得分:1)

根据the read manual

  

成功完成后,read()[XSI] [Option Start]和pread()[Option End]将返回一个非负整数,表示实际读取的字节数。

...你需要使用返回值来确定实际读取了多少字节(你可能不应该在buf之前使用&符号)。

例如。 ssize_t how_many_bytes = read(filedesc, buf, BUF_SIZE);

puts不允许您指定how_many_bytes,所以也许您最好使用fwrite

例如。 fwrite(buf, 1, how_many_bytes, stdout);

同样,the scanf manual告诉您如何使用scanf的返回值:

  

成功完成后,这些函数将返回成功匹配和分配的输入项的数量;如果早期匹配失败,此数字可以为零。如果输入在第一次匹配失败或转换之前结束,则返回EOF。如果发生读取错误,则设置流的错误指示符,返回EOF,[CX] [Option Start]和errno应设置为指示错误。 [选项结束]

例如。 if (scanf("%d", &line) != 1) { exit(0); }

Don't flush stdin ...