注册 登录
编程论坛 C语言论坛

文件操作:简单压缩程序

l13547126124 发布于 2017-03-22 15:48, 1681 次点击
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[])
{
    FILE *in, *out;
    int ch;
    char name[LEN];
    int count = 0;
    if (argc < 2)
    {
        fprintf(stderr, "usage:%s filename \n", argv[0]);
        exit(EXIT_FAILURE);
        }
    if ((in = fopen(argv[1], "r")) == NULL)
    {
        fprintf(stderr, "i couldn't open the file \"%s\"\n", argv[1]);
        exit(EXIT_FAILURE);
            }
    strncpy(name, argv[1], LEN - 5);
    name[LEN - 5] = '\0';
    strcat(name, ".red");
    if ((out = fopen(name, "w")) == NULL)
    {
        fprintf(stderr, "can't create output file .\n");
        exit(3);
            }
    while ((ch = getc(in)) != EOF)
        if (count++ % 3 == 0)
            putc(ch, out);
    if (fclose(in) != 0 | fclose(out) != 0)
        fprintf(stderr, "Error in closing files \n");
    return 0;

}
只有本站会员才能查看附件,请 登录
13 回复
#2
l135471261242017-03-22 15:51
程序多处看不懂,麻烦详细解释下。程序中 main (int argc ,char *argv [])不懂,文件操作更是没有看明白。程序运行也不成功
#3
ehszt2017-03-22 16:02
不是很懂哦,argc ,argv[i]中的值是怎么来的?帮你顶下。
#4
l135471261242017-03-22 16:09
回复 3楼 ehszt
谢谢
#5
花脸2017-03-22 21:23
int argc ,char *argv []  这是定义整形变量 argc 和 char型指针数组argv []
#6
wp2319572017-03-22 21:28
c控制台程序中 main主函数所附带的int main(int argc, char *argv[])

其含义是这样的  argc 返回参数的个数  而argv则取每一个具体的参数

#7
wp2319572017-03-22 21:33
可以这样来做一个简单的实验
程序代码:
int main(int argc, char *argv[])
{
    printf("本次传入参数%d 个\n",argc);
    for(int i=0;i<argc;i++)
    {
        printf("第%d 个参数是 %s\n",i+1,argv[i]);
    }
}

/*
D:\c_source\w2\Debug>w2 a.txt b.txt /a
本次传入参数4 个
第1 个参数是 w2
第2 个参数是 a.txt
第3 个参数是 b.txt
第4 个参数是 /a
*/

#8
ehszt2017-03-22 21:48
哦我明白了,楼主程序里的argv[1]是一个文件路径,这个路径是通过执行程序中附加参数输进去的。
在DEV c++中可通过运行-〉参数菜单输入。其他软件就不清楚了。不过如果是用命令行执行程序可以在执行程序后面加上路径.
比如执行程序名为a.exe 需要操作的文件路径为c:\b.txt
那么就在命令行中这样输入 a.exe c:\b.txt (先要进入a.exe所在目录)
#9
wp2319572017-03-22 21:52
一楼的代码 确实无法通过编译 简单修改一下
程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define LEN 256

int main(int argc, char *argv[])
{
    FILE *in, *out;
    int ch;
    char name[LEN];
    int count = 0;
    if (argc < 2)
    {
        fprintf(stderr, "usage:%s filename \n", argv[0]);
        exit(EXIT_FAILURE);
    }
    if ((in = fopen(argv[1], "r")) == NULL)
    {
        fprintf(stderr, "i couldn't open the file \"%s\"\n", argv[1]);
        exit(EXIT_FAILURE);
    }
    strncpy(name, argv[1], LEN - 5);
    name[LEN - 5] = '\0';
    strcat(name, ".red");
    if ((out = fopen(name, "w")) == NULL)
    {
        fprintf(stderr, "can't create output file .\n");
        exit(3);
    }
    while ((ch = getc(in)) != EOF)    if (count++ % 3 == 0)    putc(ch, out);
    if (fclose(in) != 0 || fclose(out) != 0)  fprintf(stderr, "Error in closing files \n");
    return 0;

}
但仅仅能够编译链接  
#10
renkejun19422017-03-23 07:21
你用VS的话,那么你就要被迫接受一堆MS的私货函数。当然问题不在于这些函数,而在于这些函数在别的编译器上完全不能用。

我靠,看了下报错,VS竟然连strncpy都默认不应该使用。

你的代码主要问题在于LEN没有定义。
其他的错误,你要自行搜索,怎么关闭VS的安全检查,因为VS在默认的情况下,认为很多函数不安全。
#11
l135471261242017-03-23 10:33
回复 9楼 wp231957
是什么原因?这个是书上的习题,学习C语言文件操作,就一直被卡在这了
#12
wp2319572017-03-23 12:17
回复 11楼 l13547126124
9楼代码是可以编译链接。你自己运行一下。看能不能得到期望的
#13
wp2319572017-03-23 12:18
回复 11楼 l13547126124
9楼代码是可以编译链接。你自己运行一下。看能不能得到期望的
#14
wp2319572017-03-23 12:25
禄脴赂麓 11脗楼 l13547126124
9脗楼麓煤脗毛脢脟驴脡脪脭卤脿脪毛脕麓陆脫隆拢脛茫脳脭录潞脭脣脨脨脪禄脧脗隆拢驴麓脛脺虏禄脛脺碌脙碌陆脝脷脥没碌脛
1