argv[1]这个文件在哪里?

u010179812 2013-05-23 11:05:27
下面这个程序是我几乎复制书上的程序,我想知道

问题一:“Usage: %s filename”是什么意思?

问题二:另外,argv[0]是文件名,argv[1]也是文件名,argv[0]这个文件名可以通过编译黑窗口看到,是以exe为扩展名,但是argv[1]到哪里去看呢?
我在cmd窗口中输入几个参数依然只能看到下面:
E:\>"Microsoft Visual Studio\MyProjects\11\Debug\11.exe " qwev rty
Usage: Microsoft Visual Studio\MyProjects\11\Debug\11.exe filename

应该说除了argv[0]外,我还输入了“qwev”与“rty”呢?应该说argv[1]为“qwev”才对呀?

问题三: if(argc != 2)是查看命令行是否有参数吗?为什么不用if(argc < 2)?


#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"

int main(int argc, char *argv[])
{
char ch;
FILE *fp;
long count = 0;

if(argc != 2)
{
printf("Usage: %s filename\n", argv[0]);
exit(1);
}

fp = fopen(argv[1], "r");
if(fp == NULL)
{
printf("Can't open %s", argv[1]);
exit(1);
}

ch = getc(fp);
while(ch != EOF)
{
count++;
putc(ch, stdout);
ch = getc(fp);
}
fclose(fp);
printf("File %s has %d characters\n", argv[1], count);

return 0;
}

...全文
2166 17 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
sinat_28267517 2015-05-17
  • 打赏
  • 举报
回复
在dos环境下 将你的程序的地址打出来 空格 将你自己建好的txt文档的地址打出来 回车 ,结果就出来了 putc(ch,stdout); //相当于 putchar(ch)~~
u010179812 2013-05-24
  • 打赏
  • 举报
回复
zhao4zhong1,我没有看明白上面。分别是哪几种方法呀? 还有第4行中cd /d c:\ dos中cd 是进入某个文件夹的意思。您这一行的意思到底是进到哪里呀? 我刚刚学了一点dos,还不是很熟悉,请进一步明说。
hugett 2013-05-23
  • 打赏
  • 举报
回复
1.“Usage: %s filename”就是当你输入出错的时候提醒用户正确的输入方法。。 2.argv[1]的确是“qwev”。。但argc == 3了。。在前边就退出了。。 3. if(argc != 2)是判断用户是否按设想的方式输入。。就是test.exe filename这样。。
图灵狗 2013-05-23
  • 打赏
  • 举报
回复
1、是告诉用户该程序的用法,需要带一个filename的参数; 2、因为你输入了qwev和rty两个参数,导致argc!=2; 3、可以用argc<2,但是不严谨,就如你2中输入了多的参数不会报错。
赵4老师 2013-05-23
  • 打赏
  • 举报
回复
你分别用下面几种方法试试:
cd /d d:\mydir
myprog myinput.txt

cd /d c:\
d:\mydir\myprog d:\mydir\myinput.txt
d:myprog d:myinput.txt
Yalye 2013-05-23
  • 打赏
  • 举报
回复
引用 11 楼 zhao4zhong1 的回复:
[quote=引用 10 楼 ikou_xu 的回复:] argv[0] 是你的执行程序名和路径 argv[1] 是你执行程序 后面填的第一个参数 以空格分隔
argv[0]不保证一定是全路径。[/quote] argv[0]对应的是程序的路径,难道也可能是相对路径还是怎样?? 希望解疑。谢谢。
u010179812 2013-05-23
  • 打赏
  • 举报
回复
这个程序可以计算一个文本文档有多少个字符,我想问如果一个word文档的话,是不是要先转换成txt文件才能计算有多少字符?
u010179812 2013-05-23
  • 打赏
  • 举报
回复
在我这个程序中,argv[1]好像必须输入一个文本文件名,否则执行到第一个if就会结束程序。
赵4老师 2013-05-23
  • 打赏
  • 举报
回复
引用 10 楼 ikou_xu 的回复:
argv[0] 是你的执行程序名和路径 argv[1] 是你执行程序 后面填的第一个参数 以空格分隔
argv[0]不保证一定是全路径。
穆村拓哉 2013-05-23
  • 打赏
  • 举报
回复
argv[0] 是你的执行程序名和路径 argv[1] 是你执行程序 后面填的第一个参数 以空格分隔
u010179812 2013-05-23
  • 打赏
  • 举报
回复
确实实现了输出。比如我在F盘建立了123.txt文本文件,在“工程、设置、Debug、U程序变量:填写命令行参数”中写入f:\\123.txt,然后再编译确认能够输出了。 我还想问argv[0]这个文件名与argv[1]这个文件名有什么区别与联系呀?我的程序是保存在E盘中的,编译显示 “E:\Microsoft Visual Studio\MyProjects\11\Debug\11.exe”,而123.txt我是存在F盘中的。
u010179812 2013-05-23
  • 打赏
  • 举报
回复
看了zhao4zhong1的话,我再试试。
u010179812 2013-05-23
  • 打赏
  • 举报
回复
不对,不对,我的两次输入导致argc==3,所以只会输出Usage: %s filename.这个我能理解。 我试着只输入一个参数qwev,会在DOS窗口中输出“Can't open qwev”。 这个我也能理解。 我不能理解的是为什么最后一步输出没有执行。
赵4老师 2013-05-23
  • 打赏
  • 举报
回复
当然,如果不在IDE中调试的话,你还可以在cmd窗口中输入以下命令: 假设你的代码编译后的可执行文件为d:\mydir\myprog.exe
cd /d d:\mydir
myprog myinput.txt
赵4老师 2013-05-23
  • 打赏
  • 举报
回复
VC6: 工程、设置、Debug、U程序变量:填写命令行参数。 VS20XX: 项目、属性、配置属性、调试、命令参数:填写命令行参数。 在这里“命令行参数”的内容你应该填写为一个存在的文件全路径,比如d:\mydir\myinput.txt
u010179812 2013-05-23
  • 打赏
  • 举报
回复
应该是把argv[1]输出不是吗?但是没有输出呀。
u010179812 2013-05-23
  • 打赏
  • 举报
回复
但是程序的这部分似乎没有执行呀?
ch = getc(fp);
    while(ch != EOF)
    {
        count++;
        putc(ch, stdout);
        ch = getc(fp);
    }

70,022

社区成员

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

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