0
ブロック単位でファイルの内容を逆にするプログラムです。ブロック単位でブロックファイルの内容を逆
#include <stdio.h>
#include <stdlib.h>
#define BS 12
void reverse(char * buffer, int size)
{
char tmp;
int i;
for(i = 0; i < size/2; i++)
{
tmp = (char)buffer[i];
buffer[i] = buffer[size - i - 1];
buffer[size - i - 1] = tmp;
}
}
int main (const int argc, const char** argv)
{
if(argc != 3)
exit(-1);
char * buffer = malloc(BS);
FILE * f1, * f2;
f1 = fopen(argv[1], "r");
f2 = fopen(argv[2], "w");
fseek(f1, 0, SEEK_END);
long i = ftell(f1);
// long f1_len = ftell(f1);
// unsigned char tmp;
int if_end = 1;
int need = 0;
int count;
do
{
i = i - BS;
if(i < 0)
{
need = BS - abs(i);
i = 0;
}
else
need = BS;
fseek(f1, i, SEEK_SET);
if(if_end) // strip EOF
{
count = fread(buffer, need - 1, 1, f1);
if_end = 0;
}
else
count = fread(buffer, need, 1, f1);
reverse(buffer, count);
fwrite(buffer, count, 1, f2);
if(i == 0)
break;
}while(i > 0);
fclose(f1);
fclose(f2);
free(buffer);
return 0;
}
テストファイル:
$ xxd testfile
0000000: 6162 6364 6566 670a abcdefg.
$ gcc test.c -o test
$ ./test testfile testfile2
$ xxd testfile2
0000000: 61 a
間違っている任意のアイデア?私はこれを長い間デバッグしてきました。
を使用しましたする必要があります
reverse(buffer,count * need)
Similairlyすべき
ので
reverse(buffer, count);
ニーズ?あなたは何を見つけましたか? – kaylum'EOF'は実際にはファイルに格納されている文字ではありません。 – kaylum
@kaylumはただそれを見ていましたが、テキストファイルの中にはEOFマーカー(0x1Aなど)を保存するものがあります。これは最後にとどまる必要があります。 –