为什么写功能不起作用?

时间:2014-11-22 17:13:06

标签: c

我试图读取文件并将内容写入其他文件,但程序执行后,完成文件为空。

这是代码:

char buf[80];

int main(int argc, char *argv[])
{
int fd;
int fs;

if( (fd=open("salida.txt",O_CREAT|O_TRUNC|O_WRONLY,S_IRUSR|S_IWUSR))<0) {
printf("\nError %d en open",errno);
perror("\nError en open");
exit(EXIT_FAILURE);
}
if( (fs=open(argv[1],O_CREAT|O_TRUNC|O_RDONLY,S_IRUSR|S_IWUSR))<0) {
printf("\nError %d en open",errno);
perror("\nError en open");
exit(EXIT_FAILURE);
}
int cont = 1;
if(fs=read(fd,&buf,80) < 0){
cont++;
    if(write(fd,&buf,80) != 80) {
        perror("\nError en el write");
        exit(EXIT_FAILURE);
        }
}

5 个答案:

答案 0 :(得分:2)

条件

if (fs=read(fd,&buf,80) < 0)

并不意味着

if ((fs = read(fd,&buf,80)) < 0)

意味着

if (fs = (read(fd,&buf,80) < 0))

并且如果读取成功则具有覆盖文件描述符 fs的效果,如果失败则为1。 (read返回读取的字节数,或者失败时返回-1。)
在任何情况下,您都不希望将结果分配给fs,因为这意味着您正在破坏写入您打开的文件的任何可能性。

另外,fd显然是你的输出文件,所以从中读取它有点奇怪。

如果要复制(最多)80个字节,可以说类似

int size = 0;
if((size = read(fs, buf, 80)) > 0){
    if (write(fd, buf, size) != size) {
        perror("\nError en el write");
        exit(EXIT_FAILURE);
    }
}

此外,截断输入文件(O_TRUNC)可能不是最佳选择。

答案 1 :(得分:1)

您似乎正在阅读fd。你的代码不是很清楚,你可能想要清理它。正如其他答案所指出的那样,您的代码中存在多个错误,并且您的意图并不完全清楚。

您应该评论您的代码并正确缩进。

答案 2 :(得分:0)

int main()
{
   char ch;
   FILE *source, *target;

   source = fopen(source_file, "r");

   if( source == NULL )
   {
      printf("Press any key to exit...\n");
      exit(EXIT_FAILURE);
   }

   target = fopen(target_file, "w");

   if( target == NULL )
   {
      fclose(source);
      printf("Press any key to exit...\n");
      exit(EXIT_FAILURE);
   }

   while( ( ch = fgetc(source) ) != EOF )
      fputc(ch, target);

   printf("File copied successfully.\n");

   fclose(source);
   fclose(target);

   return 0;
}

答案 3 :(得分:0)

您永远不会关闭文件。大多数操作系统实际上都不会对文件进行更改,直到您关闭它们为止。在此之前,您的更改仅在RAM中可见,而不在硬盘驱动器上。只需添加:

close(fd);
close(fs);

到代码的最后。 似乎还有一些其他问题(你为什么要从只写文件中读取并且似乎试图将相同的数据写回它),并且很难不清楚你想要完成什么

答案 4 :(得分:0)

// the following compiles, but the @include statements do expect linux
// so if your using a different OS, you may have to update them.

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

#define BUFFER_SIZE (80)
static  char buf[ BUFFER_SIZE ]; // static so only visible in this file
// note: file scope variables are set to 0 by the startup code


int main( int argc, char *argv[])
{
    int fd       = -1; // destination file descriptor
    int fs       = -1; // source file descriptor
    int statusRd =  0; // returned value from read
    int statusWr =  0; // returned value from write

    if( 2 > argc )
    { // then, file name parameter missing
        printf( "\ncalling format:  %s <filenametoread>\n", argv[0]);
        exit( EXIT_FAILURE );
    }

    // implied else, proper number of parameters

    // note: there should be a call to 'stat()'
    //       to assure input file exists placed here

    // open destination file, uses fixed name
    if( (fd = open("salida.txt", O_TRUNC | O_CREAT | O_WRONLY, S_IWRITE) ) <0)
    {
        printf("\nError %d en open",errno);
        perror("open for write failed");
        exit(EXIT_FAILURE);
    }

    // implied else, open of destination file successful

    if( (fs=open(argv[1],O_RDONLY,S_IREAD))<0)
    {
        printf("\nError %d en open",errno);
        perror("open for read failed");
        close(fd);  // cleanup
        exit(EXIT_FAILURE);
    }

    // implied else, open of source file successful

    do
    {
        if( (statusRd = read(fs,&buf, BUFFER_SIZE)) < 0)
        { // then read failed
            perror( "read failed" );
            close(fs); // cleanup
            close(fd); // cleanup
            exit( EXIT_FAILURE );
        }

        // implied else, read successful

        if( 0 < statusRd )
        { // then some bytes read

            if( ( statusWr = write(fd, buf, statusRd)) < 0)
            { // then, write failed
                perror("\nwrite failed");
                close(fs); // cleanup
                close(fd); // cleanup
                exit(EXIT_FAILURE);
            }
        }
    } while( statusRd > 0 ); // exit loop when reach end of file

    close(fs);
    close(fd);
    return(0);
}