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);

read がファイルの最後に到達し、0 を返すと、*buffer は設定されません。それがあなたのループが止まらない理由です。

于 2012-10-30T16:14:29.550 に答える
1

あなたの現在のコード(ファイルの終わりのテストが間違っているという事実の外)はwrite、現在の位置でファイルに存在するデータを上書きするため、1文字のファイルを作成します(最後に追加される場合を除く) )。実際、ファイルを逆にするには、最後から読み取る必要があります。

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 ごとの読み取りは unixreadおよびwriteシステム コールでは非常に効率が悪いため、2 番目のステップとして、C プリミティブ ( fopenfreadfwrite) の使用を検討するか、unix システム コールを使用してバッファリングされた読み取りと書き込みを行う必要があります。 )

見る:

于 2012-10-30T16:41:48.100 に答える
1

入力ファイル全体を読み取ってから書き出すには、読み取りが必要です。文字ごとに実行しようとしたり、lseek を使用したりしないでください。

于 2012-10-30T16:19:12.213 に答える