C从文件读取并写入反向

时间:2014-05-16 20:04:50

标签: c linux

在C中我想从文件中读取一些符号,并且对于每两个符号,我想将它们反向写入。例如,如果输入是:abcdef我希望输出为:badcfe。

#include<stdio.h>
#include<stdlib.h>
#include<fcntl.h>

FILE *f,*g;

int main(int argc,char *argv[])
{
    if((f=open(argv[1],O_RDONLY))==NULL)
    {
        fprintf(stderr,"Open file error: %s\n",argv[1]);
        return 1;
    }

    if((g=open(argv[2],O_WRONLY|O_TRUNC|O_CREAT,O_RDWR))==NULL)
    {
        fprintf(stderr,"Open file error: %s\n",argv[2]);
        fclose(f);          
        return 1;
    }

    int nr;
    char *buffer;
    buffer=(char *)malloc(sizeof(char));
    char *bufferOut=buffer;

    while((nr=read(f,buffer,2*sizeof(char))>0)){
        bufferOut[1]=buffer[0];

        bufferOut[0]=buffer[1];
        if(write(g,bufferOut,2*sizeof(char))!=2*sizeof(char)){
            printf("Writing ERROR!");
            return 1;
        }
    }
    close(f);
    close(g);
    return 0;
}

执行打开g后,内容为:aaccee

我在linux上。

2 个答案:

答案 0 :(得分:2)

我认为您的问题出在以下几行代码中:

bufferOut[1]=buffer[0];

bufferOut[0]=buffer[1];

bufferOut和buffer指向相同的内存区域,基于以下这些行:

char *buffer;
buffer=(char *)malloc(sizeof(char));
char *bufferOut=buffer;

这不执行您想要的交换。由于bufferOut和buffer指向相同的内存区域,因此您将bufferOut [0]和bufferOut [1]分配给相同的值。尝试将bufferOut [1]的原始内容存储在临时变量中,然后将其分配到bufferOut [0]中。

答案 1 :(得分:1)

正如aglasser所指出的,问题是:

bufferOut[1]=buffer[0];

此行导致bufferOut [1]的原始内容丢失。成功的交换需要额外的存储空间也许以下内容会有所帮助:

char ch = bufferOut[1];
bufferOut[1]=buffer[0];
bufferOut[0]=ch;