面试题。读取一个500m的文件,并倒序输出,要求内存占用不超过500k

zzxap 2011-04-10 12:49:17
读取一个500m的文件,并倒序输出,要求内存占用不超过500k

谁能写出来?
...全文
534 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复

#include<stdio.h>

int main()
{
FILE *pflIn,
*pflOut;
int size, i;

pflIn=fopen("1.txt", "rb");
pflOut=fopen("b.txt", "wb");
fseek(pflIn, 0, SEEK_END);
size=ftell(pflIn);
printf("%d\n", size);

fseek(pflIn, 0, SEEK_SET);
for(i=1; i<=size; i++)
{
fseek(pflIn, -i, SEEK_END);
fputc(fgetc(pflIn), pflOut);
}
fclose(pflIn);
fclose(pflOut);
return 0;
}
赵4老师 2011-04-11
  • 打赏
  • 举报
回复
#include <stdio.h>
FILE *fi,*fo;
void main() {
fo=fopen("500M.out","wb");
fi=fopen("500M.in","rb");
fseek(fi,-1L,SEEK_END);
while (1) {
fputc(fgetc(fi),fo);
if (fseek(fi,-2,SEEK_CUR)) break;
}
fclose(fi);
fclose(fo);
}
Louistao 2011-04-11
  • 打赏
  • 举报
回复
学习了
c_losed 2011-04-10
  • 打赏
  • 举报
回复
不要求效率的话 就一字节一字节的读到容器里
然后逆向输出
gattuso80 2011-04-10
  • 打赏
  • 举报
回复
迷糊 用两个指针,一个500KBuffer。
1.读文件时从后面开始读取500K,并记录此时的读文件指针位置;
2.写文件时从头开始倒写500K,并记录此时的写文件指针位置;
3.从上次读文件的位置读入500K,从写文件位置再倒写入(重复1,2);

hzhxxx 2011-04-10
  • 打赏
  • 举报
回复

这个应能解决你的问题:
std::ifstream fileObject("e:\\in.txt");
std::istreambuf_iterator<char> sBuf1(fileObject);
std::istreambuf_iterator<char> sBuf2;
std::vector<char> vecObj(sBuf1,sBuf2);
std::copy(vecObj.rbegin(),vecObj.rend(),std::ostream_iterator<char>(std::cout));

这个确实金典,但是不能保证是否就 500K,因为是内存池的.

fread
fopen
fseek
fwrite
fclose
这几个函数组合应该就可以了吧

sylcc_ 2011-04-10
  • 打赏
  • 举报
回复
使用指针 反向读出
little_angel 2011-04-10
  • 打赏
  • 举报
回复
从文件尾向文件头输出吧,,类似与管道的。。 一边从内存中读数据。一边想内存写数据。。。。。
greex 2011-04-10
  • 打赏
  • 举报
回复
这个应能解决你的问题:
std::ifstream fileObject("e:\\in.txt");
std::istreambuf_iterator<char> sBuf1(fileObject);
std::istreambuf_iterator<char> sBuf2;
std::vector<char> vecObj(sBuf1,sBuf2);
std::copy(vecObj.rbegin(),vecObj.rend(),std::ostream_iterator<char>(std::cout));
「已注销」 2011-04-10
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 ptrunner 的回复:]
用两个指针,一个500KBuffer。
1.读文件时从后面开始读取500K,并记录此时的读文件指针位置;
2.写文件时从头开始倒写500K,并记录此时的写文件指针位置;
3.从上次读文件的位置读入500K,从写文件位置再倒写入(重复1,2);

以上。
[/Quote]同意。
pstrunner 2011-04-10
  • 打赏
  • 举报
回复
用两个指针,一个500KBuffer。
1.读文件时从后面开始读取500K,并记录此时的读文件指针位置;
2.写文件时从头开始倒写500K,并记录此时的写文件指针位置;
3.从上次读文件的位置读入500K,从写文件位置再倒写入(重复1,2);

以上。
luciferisnotsatan 2011-04-10
  • 打赏
  • 举报
回复
一个字节一个字节读都是了.
ericming200409 2011-04-10
  • 打赏
  • 举报
回复
更正2:反过来读
[Quote=引用 7 楼 ericming200409 的回复:]

1 每次读一段出来比如400k(只要满足500k的内存限制即可),对读出来的部分进行倒叙操作,并将结果写入文件
,一次写一个文件,假设文件名为f1,f2,f3......

2 依次读取f1,f2,f3.。。。。将其内容输出即可。
[/Quote]
maoxing63570 2011-04-10
  • 打赏
  • 举报
回复
分匹读撒,先读出一部分,记录文件指针位置就可以了
ericming200409 2011-04-10
  • 打赏
  • 举报
回复
1 每次读一段出来比如400k(只要满足500k的内存限制即可),对读出来的部分进行倒叙操作,并将结果写入文件
,一次写一个文件,假设文件名为f1,f2,f3......

2 依次读取f1,f2,f3.。。。。将其内容输出即可。
pstrunner 2011-04-10
  • 打赏
  • 举报
回复
更正:
char chBuf[500000];

[Quote=引用 5 楼 ptrunner 的回复:]

char chBuf[500];

引用 4 楼 designkid 的回复:

内存占用怎么控制
[/Quote]
pstrunner 2011-04-10
  • 打赏
  • 举报
回复
char chBuf[500];

[Quote=引用 4 楼 designkid 的回复:]

内存占用怎么控制
[/Quote]
DesignKid 2011-04-10
  • 打赏
  • 举报
回复
内存占用怎么控制
qq120848369 2011-04-10
  • 打赏
  • 举报
回复
从文件末尾往前读即可.
zyc_0204 2011-04-10
  • 打赏
  • 举报
回复
移动文件指针到后面。从后面读一定的内容输出,然指针前移。

64,691

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧