1

特定のファイルを取得し、txt を反転したファイルを作成するプログラムを作成することになっています。ファイルの正確なサイズがわからない場合、ファイルの最後から read() を開始し、作成されたファイルの最初のバイトにコピーする方法はありますか? また、これをグーグルで検索し、fread、fopenなどの多くの例に出くわしました。ただし、このプロジェクトではそれらを使用できません。読み取り、オープン、lseek、書き込み、およびクローズのみを使用できます。これまでの私のコードはそれほど多くはありませんが、参照用です:

#include<stdio.h>
#include<unistd.h>

int main (int argc, char *argv[])
{
    if(argc != 2)/*argc should be 2 for correct execution*/
    {
        printf("usage: %s filename",argv[0[]);}
    }
    else
    {
    int file1 = open(argv[1], O_RDWR);
    if(file1 == -1){
    printf("\nfailed to open file.");
        return 1;
    } 
    int reversefile = open(argv[2], O_RDWR | O_CREAT);

    int size = lseek(argv[1],    0, SEEK_END);
    char *file2[size+1];
    int count=size;
    int i = 0

    while(read(file1, file2[count], 0) != 0)
    {
      file2[i]=*read(file1, file2[count], 0);
      write(reversefile, file2[i], size+1);
      count--;
      i++;
      lseek(argv[2], i, SEEK_SET);
   }
4

3 に答える 3

1

ほとんどのファイルシステムがこの操作を効果的にサポートするように設計されているとは思えません。最後まで読むには、ファイル全体を読まなければならない可能性があります。同じ理由で、ほとんどの言語には、ファイルを逆方向​​に読み取るための特別な機能が含まれていない可能性があります。

何かを思いつくだけです。メモリ内のファイル全体を読み取ろうとします。大きすぎる場合は、先頭を反転して一時ファイルにダンプし、読み続けます... 最後に、すべての一時ファイルを 1 つに結合します。また、ディスク セクタを手動で低レベルに操作するか、少なくともファイル システムに対して直接低レベルのプログラミングを行うことで、何かスマートなことを行うことができるでしょう。しかし、これはあなたが求めているものではないようです。

于 2013-10-11T19:41:43.127 に答える
0

これにはエラーチェックがありません==本当に悪いです

  1. stat を使用してファイル サイズを取得する
  2. malloc でバッファを作成する
  3. ファイルをバッファに読み込む
  4. ファイルの末尾へのポインタを設定します
  5. バッファを逆方向に各文字を出力します。

Google でクリエイティブになれば、このような例をいくつか得ることができます。IMO これまでに得た支援は、実際には良いヒントではありません。これは学業のように見えるので、コピーに注意してください。ここで使用されている呼び出しについて読んでください。stat (fstat) fread (読み取り)

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/stat.h>

int main(int argc, char **argv)
{
   struct stat st;
   char *buf;
   char *p;
   FILE *in=fopen(argv[1],"r");   
   fstat(fileno(in), &st);         // get file size in bytes
   buf=malloc(st.st_size +2);      // buffer for file
   memset(buf, 0x0, st.st_size +2 );
   fread(buf, st.st_size, 1, in);  // fill the buffer
   p=buf;
   for(p+=st.st_size;p>=buf; p--)  // print traversing backwards
      printf("%c", *p);
   fclose(in);   
   return 0;
}
于 2013-10-11T20:11:40.690 に答える
0

fseekファイル内をナビゲートしてみませんか? この関数は、 や と同様に に含まれてstdio.hいます。fopenfclose

別のアイデアは、単純なスタックを実装することです...

于 2013-10-11T19:39:33.597 に答える