2012-02-09 71 views
1

我创建了一个快速程序来简单地获取文件的内容并将它们转换为输出文件。我第一次运行我的程序时,我没有遇到任何错误,看起来好像一切都会正常工作。但是,当我检查我的输出文件时,文件中没有任何内容。我的第一个想法是,权限不正确,不允许写作。当我在目录中手动创建一个.txt文件并设置权限,然后运行程序时,它似乎工作(Ubuntu显示文件的内容,副本),但我无法打开实际的文件。 希望有比我更有经验的人可以帮助我。 那么这里是我的代码:使用read(),write(),open()将文件的内容复制到另一个文件

int main(int argc, char* argv[]){ 
    char buf[128]; 
    int outft, inft,fileread; 
    // output file opened or created 
    if((outft = open(argv[1], O_CREAT | O_APPEND | O_RDWR))==-1){ 
    perror("open"); 
    } 
    // lets open the input file 
    inft = open(argv[2], O_RDONLY); 
    if(inft >0){ // there are things to read from the input 
    fileread = read(inft, buf, 160); 
    printf("%s\n", buf); 
    write(outft, buf, 160); 
    close(inft); 
    } 
    close(outft); 
    return 0; 
} 
+2

你读160个字节到128字节的缓冲区? – 2012-02-09 21:33:51

+0

如果输入文件的打开失败,则不会报告。 'read()'和'write()'的返回值也被取消选中。 – hmjd 2012-02-09 21:34:39

+0

@ paulsm4对权限是正确的 - 当使用'open_()'使用'O_CREAT'时,它们是必需的。如果我运行这段代码(修复了缓冲区溢出),我会在新文件上获得文件权限的随机垃圾。 – Dmitri 2012-02-10 00:44:13

回答

2

你的数据缓冲区的大小是128个字节,但你读160个字节的数据到它。这意味着你正在写入声明缓冲区之外的内存。

我预计变量outft, inft, and fileread可能在内存中跟着buf,并且在read()调用期间被垃圾覆盖。对write()的调用可能会失败,因为它正在为文件描述符写入一个垃圾值。

为了避免缓冲区溢出,sizeof是你的朋友:

fileread = read(inft, buf, sizeof(buf)); 
... 
write(outft, buf, fileread); 
+0

是啊,算出来,并意识到这是一个错误如何derp。 – 2012-02-09 22:22:26

3

一定要设置文件权限。

例:

if((outft = open(argv[1], O_CREAT | O_APPEND | O_RDWR, 0666))==-1){ 
    perror("open"); 
    } 
相关问题