【发布时间】:2013-07-26 08:54:01
【问题描述】:
我看过很多帖子,但没有找到我想要的。
我得到错误的输出:
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ...... // 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;
}
UPD 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. 在记事本++中处理windows
这不是家庭作业
我也想在不使用更多内存或使用 STL 的情况下这样做。
我正在练习以提高我的基础知识,所以请不要发布任何功能(如 tail -5 tc.)
请帮助改进我的代码。
【问题讨论】:
-
提示:
fgetc将文件位置指示器提高一。 -
试试
fseek(f1,pos-1, SEEK_SET);和文件模式 bin。 -
C 还是 C++?选一个。 (提示:主要是 C。)
-
是的,为什么不用
fstream? -
@nkint 更重要的是:为什么不使用
std::vector<char>,从一个相当大的值开始,并根据需要增加它?