0

我正在尝试编写一个可以反转文件内容的程序。因此,给输入文件的内容为“abc”,它应该创建一个内容为“cba”的文件。

不幸的是,它不起作用,我不明白为什么。

你们能帮帮我吗?谢谢

编辑:我忘了提到这是一项学校作业 - 我们必须使用像 lseek 和 open 这样的功能 - 请不要让我认为我应该使用 fgetc 和其他功能 :)

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

void reverse_file(char * in, char * out)
{
    int infile, outfile;
    infile = open(in, O_RDONLY);
    outfile = open(out, O_WRONLY);

    char buffer;
    char end = EOF;
    write(outfile, &end, sizeof(char));
    do
    {
        // seek to the beginning of a file

        read(infile, &buffer, sizeof(char));


        // printf("the code of a character %d\n", buffer); // returns 10 instead of EOF

        lseek(outfile, 0, SEEK_SET);
        write(outfile, &buffer, sizeof(char));

    } while (buffer != EOF);
    close(outfile);
    close(infile);


}

int main()
{
    reverse_file("tt", "testoutput");

    return 0;
}
4

3 回答 3

2

read返回它读取的字节数。要在到达文件末尾时停止循环,请将条件更改为 read 的返回值。

int read_ret;
do
{
    // seek to the beginning of a file

    read_ret = read(infile, &buffer, sizeof(char));


    // printf("the code of a character %d\n", buffer); // returns 10 instead of EOF

    lseek(outfile, 0, SEEK_SET);
    write(outfile, &buffer, sizeof(char));

} while (read_ret > 0);

当读取到达文件末尾并返回零时,它不会设置 *buffer。这就是为什么你的循环永远不会停止的原因。

于 2012-10-30T16:14:29.550 回答
1

您需要阅读以读取整个输入文件,然后将其写出。不要试图逐个字符地进行,也不要使用 lseek。

于 2012-10-30T16:19:12.213 回答
1

您当前的代码(除了对文件结尾的测试错误的事实之外)将创建一个只有一个字符的文件,因为会write覆盖文件中当前位置的数据(除非它在末尾,它会在其中追加)。实际上,要反转文件,您应该从头开始阅读它。

struct stat instat;
int pos;

fstat(infile, &instat);
pos = instat.st_size - 1;
do
{
    // seek backward in the input file, starting from the end
    lseek(infile, SEEK_SET, pos);
    read(infile, &buffer, sizeof(char));
    write(outfile, &buffer, sizeof(char));

} while (pos-- > 0);

(通过 char 读取 char 对 unix和系统调用非常低效,因此作为第二步,您应该考虑使用 C 原语(, , ),或者使用 unix 系统调用进行一些缓冲读取和写入。readwritefopenfreadfwrite

看:

于 2012-10-30T16:41:48.100 回答