多くの投稿を見てきましたが、欲しいものは見つかりませんでした。
私は間違った出力を得ています:
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ...... // may be this is EOF character
無限ループに入ります。
私のアルゴリズム:
- ファイルの終わりに移動します。
- ポインターの位置を 1 減らし、1 文字ずつ読み取ります。
- 10行が見つかった場合、またはファイルの先頭に達した場合は終了します。
- ここで、ファイル全体を EOF までスキャンし、//コードに実装されていないものを出力します。
コード:
#include<iostream>
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<string.h>
using namespace std;
int main()
{
FILE *f1=fopen("input.txt","r");
FILE *f2=fopen("output.txt","w");
int i,j,pos;
int count=0;
char ch;
int begin=ftell(f1);
// GO TO END OF FILE
fseek(f1,0,SEEK_END);
int end = ftell(f1);
pos=ftell(f1);
while(count<10)
{
pos=ftell(f1);
// FILE IS LESS THAN 10 LINES
if(pos<begin)
break;
ch=fgetc(f1);
if(ch=='\n')
count++;
fputc(ch,f2);
fseek(f1,pos-1,end);
}
return 0;
}
更新 1:
コードの変更: エラーが 1 つだけになりました - 入力に次のような行がある場合
3enil
2enil
1enil
it prints 10 lines only
line1
line2
line3ÿine1
line2
line3ÿine1
line2
line3ÿine1
line2
line3ÿine1
line2
PS:
1. notepad++ でウィンドウを操作する
これは宿題ではありません
また、これ以上メモリを使用したり、STL を使用したりせずに実行したいと考えています。
基本的な知識を向上させるために練習しているので、関数について投稿しないでください (tail -5 tc など)。
私のコードを改善するのを手伝ってください。