一段很简单的C程序,请帮忙排错

jdgdf566 2018-08-23 10:09:52
复制文件而已

/**
* 主函数
*/
int main(int argc, char *argv[])
{
if(argc == 1) return 0;
FILE* fileSRC = fopen(argv[1], "r");
if(fileSRC == NULL)
{
printf("文件不存在或不可读");
return 0;
}
FILE* fileDST1 = fopen(strcat(argv[1], ".1"), "w+");
//
unsigned int bufferSize = 1024*1024; //1M bytes buffer
void* bufferSrc = malloc(bufferSize);
unsigned int length = 0;
while( !feof(fileSRC) )
{
length = fread(bufferSrc, bufferSize, 1, fileSRC);
printf("%d", length);
fwrite(bufferSrc, length, 1, fileDST1);
}
fclose(fileSRC); fclose(fileDST1); free(bufferSrc);
return 0;
}

输出:0
...全文
771 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
honghuyuyu 2018-08-28
  • 打赏
  • 举报
回复
好贴,不错 必须支持一下
zhangchm2018 2018-08-24
  • 打赏
  • 举报
回复
引用 1 楼 Slzde_sub 的回复:


这代码看得我头痛,写个配置文件或者怎么的不好么。。要用命令行传参

还有fread一般写成 fread(bufferSrc, 1, bufferSize, fileSRC);
否则你的length 不是1 就是0 (1表示读取了size字节,0表示字节数不够size);
不会返回真实的读取字节数
导致于fwrite就很显然了。。

我用的是VS2012
zhangchm2018 2018-08-24
  • 打赏
  • 举报
回复
引用 1 楼 Slzde_sub 的回复:


这代码看得我头痛,写个配置文件或者怎么的不好么。。要用命令行传参

还有fread一般写成 fread(bufferSrc, 1, bufferSize, fileSRC);
否则你的length 不是1 就是0 (1表示读取了size字节,0表示字节数不够size);
不会返回真实的读取字节数
导致于fwrite就很显然了。。


大佬,我按照你说的改了之后,出现上面的错误,bufferSize怎么改都没有用,请问是什么回事
jdgdf566 2018-08-24
  • 打赏
  • 举报
回复
被这个例子误导了:http://www.runoob.com/cprogramming/c-function-fread.html
#include <stdio.h>
#include <string.h>

int main()
{
FILE *fp;
char c[] = "This is runoob";
char buffer[20];

/* 打开文件用于读写 */
fp = fopen("file.txt", "w+");

/* 写入数据到文件 */
fwrite(c, strlen(c) + 1, 1, fp);

/* 查找文件的开头 */
fseek(fp, SEEK_SET, 0);

/* 读取并显示数据 */
fread(buffer, strlen(c)+1, 1, fp);
printf("%s\n", buffer);
fclose(fp);

return(0);
}

他这个例子我没试验。
六道佩恩 2018-08-24
  • 打赏
  • 举报
回复
引用 2 楼 Slzde_sub 的回复:
[quote=引用 1 楼 Slzde_sub 的回复:]


这代码看得我头痛,写个配置文件或者怎么的不好么。。要用命令行传参

还有fread一般写成 fread(bufferSrc, 1, bufferSize, fileSRC);
否则你的length 不是1 就是0 (1表示读取了size字节,0表示字节数不够size);
不会返回真实的读取字节数
导致于fwrite就很显然了。。


补充。。建议你好好看看fread的返回值, 不要把第二个参数和第三个参数互换 , 很坑人的[/quote]
老哥,我想问下怎么用配置文件传参?
sghcpt 2018-08-24
  • 打赏
  • 举报
回复
楼主,如果能确定读取的文件的大小小于1M,那么上面的代码应该可以的。至于运行时出现崩溃,应该是strcat(argv[1], ".1")这行代码的导致的吧。。下面代码可供参考:
#include "iostream"
using namespace std;

int main(int argc, char *argv[])
{
if (argc == 1) return 0;
FILE* fileSRC = fopen(argv[1], "r");
if (fileSRC == NULL)
{
printf("文件不存在或不可读");
return 0;
}
char szDest[256] = { 0 };
sprintf_s(szDest, 256, "%s%s", argv[1], ".1");
FILE* fileDST1 = fopen(szDest, "w+");

unsigned int bufferSize = 1024 * 1024; //1M bytes buffer
void* bufferSrc = malloc(bufferSize);
unsigned int length = 0;
while (!feof(fileSRC))
{
length = fread(bufferSrc, 1, bufferSize, fileSRC);
printf("%d", length);
fwrite(bufferSrc, length, 1, fileDST1);
}
fclose(fileSRC);
fclose(fileDST1);

free(bufferSrc);

return 0;
}
JhonDao 2018-08-24
  • 打赏
  • 举报
回复
引用 11 楼 Slzde_sub 的回复:
[quote=引用 10 楼 housecarl 的回复:]
用vs写的程序复制文件,调用下copyfile不就可以了。搞那么麻烦干嘛


别人是为了学习写程序,,,那我直接ctrl+c ctrl +v 不好么。。还写个程序?[/quote]
这句话才是这篇帖子的精华
轻箬笠 2018-08-24
  • 打赏
  • 举报
回复
用vs写的程序复制文件,调用下copyfile不就可以了。搞那么麻烦干嘛
jdgdf566 2018-08-24
  • 打赏
  • 举报
回复
记录一下
fread一般写成length = fread(bufferSrc, 1, bufferSize, fileSRC);
否则length 不是1就是0(1表示读取了size字节,0表示字节数不够size),不会返回真实的读取字节数。

feof判断文件结尾是要先读再判断的,也就是说哪怕到文件结尾了,这个while也会多循环一次 只是length=0 罢了,所以要用feof 就最好写成do 。。while 的形式
zhangchm2018 2018-08-24
  • 打赏
  • 举报
回复
引用 9 楼 Slzde_sub 的回复:



看你这个样子。还是给你讲清楚一些, 你只开辟了size大小的字节数,fread和fwrite的时候要 减一 !! 或者开辟的时候 加一

试验了下,这个崩溃跟13楼说的一样,是因为修改了命令行参数导致的错误。

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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