一道华为的面试题,进来看看会不会被鄙视!

wykqhyjs 2011-07-24 11:55:20
要求阅读下 下面的程序 ,说说该 代码的正确性 ,优缺点
#include <stdio.h>
void test(FILE *fread, FILE *fwrite)
{
char buf[1024] = {0};
if (!fgets(buf, sizeof(buf), fread))
return;
test( fread, fwrite );
fputs(buf, fwrite);
}
int main(int argc, char *argv[])
{
FILE *fr = NULL;
FILE *fw = NULL;
fr = fopen("data", "rb");
fw = fopen("dataout", "wb");
test(fr, fw);
fclose(fr);
fclose(fw);
return 0;
}
...全文
646 49 打赏 收藏 转发到动态 举报
写回复
用AI写文章
49 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhengjiankang 2011-08-10
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 mougaidong 的回复:]

递归 有 “保护现场机制”的 ,这个buf确实是每次都在复用。

名字只是一个表象,它也就是个地址。

把整个过程理解为,执行流在多个相同的函数中跳转。
[/Quote]

显然不是复用buf啊。
递归每调用一次就会在栈上增加一个buf。
文件大点直接栈溢出错误。
wykqhyjs 2011-08-10
  • 打赏
  • 举报
回复
顶,,
MyAngele 2011-08-10
  • 打赏
  • 举报
回复
还应该加个文件打开判断。
MyAngele 2011-08-10
  • 打赏
  • 举报
回复
//刚测过的 代码修改如下

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

char *buf;
bool test(FILE * fr,FILE * fw)
{
fseek(fr,0,SEEK_END);
long len=ftell(fr);
fseek(fr,0,SEEK_SET);
buf=(char *)calloc(len,sizeof(char));

if(!fread(buf,sizeof(char),len,fr))
return false;

if(fwrite(buf,sizeof(char),len,fw))
return false;

return true;

}
int main()
{
FILE *fr=fopen("data","rb");
FILE *fw=fopen("dataout","wb");

if (!test(fr,fw))
{
fclose(fr);
fclose(fw);
free(buf);
printf("Read the file error ");
return -1;

}
fclose(fr);
fclose(fw);
free(buf);
printf("Read the file successful ");
return 0;
}
xiaojunjun1202 2011-08-10
  • 打赏
  • 举报
回复
[Quote=引用 35 楼 x308603129 的回复:]
引用 5 楼 ganjianh8 的回复:
1.test没有判断传入参数为空的情况,容易崩掉;
2.判断那个状态用feof或ferror比判断空好让人看懂程序的逻辑;
3.main函数的几个参数没用到,可以不用列出参数的变量名;
4.test递归执行过程中,buf不停开辟,如果文件内容过多会造成栈溢出。


1.二进制打开,fgets字符串读写

2.文件打开/写失败未判断

……
[/Quote]

ding
MyAngele 2011-08-10
  • 打赏
  • 举报
回复
这段代码很垃圾啊
MyAngele 2011-08-10
  • 打赏
  • 举报
回复
开辟内存的大小和方式不对,应该用动态的方式。
MyAngele 2011-08-10
  • 打赏
  • 举报
回复
test( fread, fwrite );
fputs(buf, fwrite);
这两句顺序换下,要不然怎么循环读取啊。
liuling_8008 2011-08-10
  • 打赏
  • 举报
回复
这个函数主要实现了文件拷贝。函数名字test也挺奇怪的。
用一个循环就可以实现文件拷贝。
代码请参考
http://wenku.baidu.com/view/7cfaa93a580216fc700afd79.html
liuhex 2011-08-10
  • 打赏
  • 举报
回复
顶一下
一叶之舟 2011-08-10
  • 打赏
  • 举报
回复
还有一个文件读写顺序的问题,读是从头读,写是从后住前写
一叶之舟 2011-08-10
  • 打赏
  • 举报
回复
同时文件打开没有判断成功或失败,
还有一个很致命的问题,
char buf[1024] = {0};
if (!fgets(buf, sizeof(buf), fread))
这样读出1024,buf后面的内容是不可知的,也就是说
的时候把buf做为字符串写可能写入的不知道会是多少。
fputs(buf, fwrite);
一叶之舟 2011-08-10
  • 打赏
  • 举报
回复
用递归方式实现void test(FILE *fread, FILE *fwrite)
会导致栈越界,每次调用会分配1024,一个10M的文件程序肯定崩溃。
5t4rk 2011-08-10
  • 打赏
  • 举报
回复

这个程序写的确实很恼火
5t4rk 2011-08-10
  • 打赏
  • 举报
回复

这个程序写的确实很恼火
x308603129 2011-08-10
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 ganjianh8 的回复:]
1.test没有判断传入参数为空的情况,容易崩掉;
2.判断那个状态用feof或ferror比判断空好让人看懂程序的逻辑;
3.main函数的几个参数没用到,可以不用列出参数的变量名;
4.test递归执行过程中,buf不停开辟,如果文件内容过多会造成栈溢出。
[/Quote]

1.二进制打开,fgets字符串读写

2.文件打开/写失败未判断

5.fread,fwrite变量名和API重复

5楼和31楼综合一下,差不多了
wykqhyjs 2011-07-31
  • 打赏
  • 举报
回复
谁贴点正确的代码啊
辰岡墨竹 2011-07-31
  • 打赏
  • 举报
回复
逆转文件的话,应该用内存映射文件来做。对于超过5MB以上的大文件,速度能快数倍。
LZ你这个递归用法肯定不行,不仅别扭。而且你相当于是逆序1024位块,每个块内部还是顺序的。
可以参考一下:
http://sudami.5d6d.com/viewthread.php?tid=36
hndcwynui 2011-07-27
  • 打赏
  • 举报
回复
如果文件的行数特别多的话, 容易栈溢出, 还有这个代码是要拷贝文件的话,代码逻辑有些问题
void test(FILE *fread, FILE *fwrite)
{
char buf[1024] = {0};
if (!fgets(buf, sizeof(buf), fread))
return;
fputs(buf, fwrite);
test( fread, fwrite );
}
HELLO456 2011-07-27
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 michael_xie 的回复:]
去华为面了几回,总被综合面试给耍了,从此之后华为打N个电话都不去了。
[/Quote]
是不是哦 说明你还是比较牛的啥 我都还没有去过 好像只招研究生吧 做软件的
加载更多回复(29)

64,654

社区成员

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

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