作者Bencrie ()
看板C_and_CPP
标题Re: [问题] 想请问各位先进一个开档的问题
时间Tue Mar 10 11:33:49 2009
※ 引述《wansincere (阿洵)》之铭言:
: 各位先进午安。
: 我是新手个人自学所以有些观念可能错很大
: 以下如果有太离谱的地方还请各位先进不吝指教,谢谢。
: 说明有点长,我的问题在最後。
: 我试着写一支UNIX下的开档程式,用C语言写
: main传入变数的地方是这样的:
: (int argc, char *argv[])
: 格式是(程式名 档案来源 输出目录)
: 作用是把来源档案复制一份到输出目录
: 但是实际执行的时候我不可能一个参数一个参数下
: 类似这样: $:> pname a.txt b.txt c.txt new
: 应该这样: $:> pname *.txt new
: 因为最後一个参数是输出的目录
: 所以我就把最後一个参数提出来:
: int itdir = argc - 1;
: mkdir(argv[itdir]);
: 然後再用for回圈去抓argc的值:
: for(a=1;a<=argc-2;a++){
: strcat(argv[itdir],argv[a]);
: FILE *file2 = fopen(argv[itdir], "w");
改成这样:
int itdir=argc-1;
char* tmp;
FILE* input;
FILE* output;
mkdir(argv[itdir]);
for(a=1;a<=argc-2;a++)
{
tmp=malloc(strlen(argv[itdir])+strlen(argv[a])+1); //配置记忆体
strcpy(tmp,argv[itdir]); //复制资料夹名称
strcat(tmp,"/"); //接上 "/"
strcat(tmp,argv[a]); //把档名接上去
input=fopen(argv[a],"r"); //开启输入档
output=fopen(tmp,"w"); //开启输出档
.
.
.
//资料复制
fclose(input);
fclose(output);
free(tmp);
}
... 大致上长这样,有错误请指正 XDD
: 这麽做有一个大问题
: 就是传出的档名会变这样: a.txt a.txtb.txt
: 所以我就想从argv[itdir]下手
: 清空重抓不太实际,毕竟内容已经被改变了
: 所以我就想先把他指定给别的变数保留
: 回圈中再读出来,但是读出来之後记忆体位置没变内容却改变了
: 如果我的参数是./new/,回来变成_/n\ew/
: 可能不只如此,因为档案开得乱七八糟
: 试了多次不得要领我决定改变做法:
: size_t length;
: length = strlen(argv[itdir]);
: 先算出目录参数的长度
: strncpy(argv[itdir],argv[itdir],length);
: 再从回圈中把他拷贝回原始长度
: 但是我显然太天真了,strncpy没发挥任何作用
: 我想说可能是参数一参数二不能相同吧,但是从设一个tmp出来也一样
: 至此我还在继续研究
: 但有几个问题想请问各位先进
: 1.有没有办法直接读取argv的最後一个参数?不确定argv数量的时候有没有
: 比较正规的作法?
: 2.fopen可以带入两个变数吗?(fopen(argv[itdir]/argv[a], "w");)
: 类似这样的。
: 3.如果都不行的话,还请各位先进给我一点提示,谢谢(鞠躬)
--
Coding 日志 & Linux 使用心得
Rinoworks Blog
http://rinoworks.blogspot.com/
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.121.197.32
※ 编辑: Bencrie 来自: 140.121.197.32 (03/10 11:34)
1F:推 wansincere:原来如此,Bencrie前辈给了我很大的启示 03/10 11:43
2F:→ wansincere:实在是太感谢了,朝闻道午吃饭可矣^^" 03/10 11:45
3F:→ wansincere:听君一席话胜读十本书,您的回应就好像黑暗中的一盏明 03/10 11:47
4F:→ wansincere:我不知道该如何表达我的感谢,谢谢 03/10 11:48
5F:推 wansincere:我测试您的作法确实成功了 03/10 11:52
6F:→ weiyucsie:用sprintf看起来比较直觉XD 03/10 15:55
7F:→ weiyucsie:sprintf(tmp, "%s/%s", argv[itdir], argv[a]); 03/10 15:56
8F:→ Bencrie:忘记还有sprintf可以用 XDD 03/10 17:06
9F:推 wansincere:sprintf确实很好用(笔记) 03/11 16:17