gpt4 book ai didi

c++ - 在 C/C++ 中从文件中读取最后 n 行

转载 作者:IT老高 更新时间:2023-10-28 23:13:10 26 4
gpt4 key购买 nike

我看过很多帖子,但没有找到我想要的。
我得到错误的输出:

ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ......  // may be this is EOF character

进入无限循环。

我的算法:

  1. 转到文件末尾。
  2. 指针位置减1,读取字符减1特点。
  3. 如果找到 10 行或到达文件开头,则退出。
  4. 现在我将扫描整个文件直到 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. 在 Notepad++ 中处理windows

  1. 这不是家庭作业

  2. 我也想在不使用更多内存或使用 STL 的情况下做到这一点。

  3. 我正在练习提高我的基础知识,所以请不要发布任何功能(如tail -5 tc。)

请帮助改进我的代码。

最佳答案

代码中的注释

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
FILE *in, *out;
int count = 0;
long int pos;
char s[100];

in = fopen("input.txt", "r");
/* always check return of fopen */
if (in == NULL) {
perror("fopen");
exit(EXIT_FAILURE);
}
out = fopen("output.txt", "w");
if (out == NULL) {
perror("fopen");
exit(EXIT_FAILURE);
}
fseek(in, 0, SEEK_END);
pos = ftell(in);
/* Don't write each char on output.txt, just search for '\n' */
while (pos) {
fseek(in, --pos, SEEK_SET); /* seek from begin */
if (fgetc(in) == '\n') {
if (count++ == 10) break;
}
}
/* Write line by line, is faster than fputc for each char */
while (fgets(s, sizeof(s), in) != NULL) {
fprintf(out, "%s", s);
}
fclose(in);
fclose(out);
return 0;
}

关于c++ - 在 C/C++ 中从文件中读取最后 n 行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17877025/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com