搜索
查看: 1049|回复: 16
打印 上一主题 下一主题

一个简单的文件压缩例题,怎样查看运行结果?

[复制链接]
跳转到指定楼层
楼主
发表于 2014-7-14 15:03:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
5啊哈币
本帖最后由 嗨,强哥! 于 2014-7-14 15:22 编辑

/**************************************************************************
《C Primer Plus》第五版第十三章,程序例题(P361):

reducto.c --- 把您的文件压缩三分之一!

一个简单的文件压缩程序:这个程序把一个文件中的数据有选择的复制到另一个文件中
程序通过只保留每3个字符中的第3个字符来压缩地一个文件,最后把压缩后的文本写入
第二个文件中,第二个名字有第一个名字后加 .red 而得来。
***************************************************************************/

#include <stdio.h>
#include <stdlib.h>          //为了调用exit ()
#include <string.h>         //为strcpy () 和 strcat ()函数提供原型
#define LEN 40

int main(int argc, char *argv[])
{
        FILE *in, *out;  //声明两个FILE指针
        int ch;
        char name[LEN];  //用于存储输入文件名
        int count = 0;

    //检查命令行参数
    if (argc < 2)  
    {
                fprintf (stderr,"Usage: %s filename\n",argv[0]);
                exit (1);
    }
    //实现输入
    if ((in = fopen (argv[1], "r")) == NULL)
    {
                fprintf (stderr, "I coundn't open the file \"%s\"\n",argv[1]);
                exit (2);
    }
    //实现输出
    strcpy (name, argv[1]);     //把文件名复制到数组中
    strcat (name, ".red");       //在文件名后添加 .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);  //打印每3个字符中的第3个

    //收尾工作
    if (fclose (in) != 0 || fclose (out) != 0)
                fprintf (stderr, "Error in closing files\n");

    sleep(50000);
    return 0;
}




最佳答案

查看完整内容

最简单的方法是编译好后在命令行下运行 例如编译好的可执行文件名是foo.exe,然后文本文件是bar.txt,两个文件在同一目录下面 然后在命令行下输入 foo bar.txt 执行完成后,会得到一个bar.txt.red 然后用记事本打开这个bar.txt.red 程序的问题主要是两个,第一是没有检验name这个数组够不够大,第二是 这不是打印3个中的第三个,而是打印每3个中的第一个 此外就是在主函数返回之前关闭文件算不上好的风格,虽 ...
沙发
发表于 2014-7-14 15:03:55 | 只看该作者
嗨,强哥! 发表于 2014-7-15 09:09
朋友能不能详细说一下程序运行前的准备工作和程序运行后的输入。

另,除了sleep()有问题外,还有哪 ...

最简单的方法是编译好后在命令行下运行

例如编译好的可执行文件名是foo.exe,然后文本文件是bar.txt,两个文件在同一目录下面
然后在命令行下输入
foo bar.txt

执行完成后,会得到一个bar.txt.red
然后用记事本打开这个bar.txt.red

程序的问题主要是两个,第一是没有检验name这个数组够不够大,第二是
  1. if (count++ % 3 == 0)
  2.                         putc (ch, out);  //打印每3个字符中的第3个
复制代码

这不是打印3个中的第三个,而是打印每3个中的第一个

此外就是在主函数返回之前关闭文件算不上好的风格,虽然有的代码规范要求这么做
但标准库的实现中,要求退出时自动关系打开的文件
明确规定会自动做的事情,却要手动去做一下,并不见得多高明

点评

标准库的实现中,要求退出时自动关系打开的文件,再写就多此一举了。  发表于 2014-7-16 10:11
板凳
发表于 2014-7-14 18:03:53 | 只看该作者
和输入文件同一级目录下面有个xxxx.red,用记事本打开
(因为代码里面是用文本模式打开的,所以输入也必须是个文本文件)

这是书上的示例代码?小问题不少……
地板
发表于 2014-7-14 19:56:21 来自手机 | 只看该作者
指针用着就是好,
5#
发表于 2014-7-14 19:56:41 来自手机 | 只看该作者
指针用着就是好,,,
6#
发表于 2014-7-14 19:56:46 来自手机 | 只看该作者
指针用着就是好,,,
7#
发表于 2014-7-14 19:59:06 来自手机 | 只看该作者
运行结果是指,?
8#
 楼主| 发表于 2014-7-15 08:42:25 | 只看该作者
rosynirvana 发表于 2014-7-14 18:03
和输入文件同一级目录下面有个xxxx.red,用记事本打开
(因为代码里面是用文本模式打开的,所以输入也必须 ...

关于上面的例题,今天想起来一个问题:
在啊哈C下sleep(50000);应该是s大写,而且要有包含头文件。怪是程序照样编译成功运行,只是一闪而过。
后来我换了其他编译器按书上的例题输入运行正常了。
9#
 楼主| 发表于 2014-7-15 08:45:35 | 只看该作者
超神级 发表于 2014-7-14 19:59
运行结果是指,?

一闪而过。
10#
 楼主| 发表于 2014-7-15 08:47:21 | 只看该作者
超神级 发表于 2014-7-14 19:56
指针用着就是好,

我感觉C的思想就是:描述数据,加工数据,模块化。其中最具特色的是指针,也就是数据的地址。
11#
 楼主| 发表于 2014-7-15 09:09:18 | 只看该作者
rosynirvana 发表于 2014-7-14 18:03
和输入文件同一级目录下面有个xxxx.red,用记事本打开
(因为代码里面是用文本模式打开的,所以输入也必须 ...

朋友能不能详细说一下程序运行前的准备工作和程序运行后的输入。

另,除了sleep()有问题外,还有哪些其他那些小问题,还请指明。感谢啦。
12#
 楼主| 发表于 2014-7-15 09:12:53 | 只看该作者
rosynirvana 发表于 2014-7-14 18:03
和输入文件同一级目录下面有个xxxx.red,用记事本打开
(因为代码里面是用文本模式打开的,所以输入也必须 ...

int main(int argc, char *argv[])
因为C语言我学的东西少,第一次见main()还带参数,能否简单讲解下?先谢谢了。
13#
发表于 2014-7-15 15:10:25 | 只看该作者
嗨,强哥! 发表于 2014-7-15 08:42
关于上面的例题,今天想起来一个问题:
在啊哈C下sleep(50000);应该是s大写,而且要有包含头文件。怪是 ...

sleep的两种半标准化写法
1. 用winapi,也就是啊哈C的写法:
#include <windows.h>

Sleep(5000);

2. 用posix api,也就是大多数编译器的做法
#include <unistd.h>

sleep(5);

点评

谢谢!  发表于 2014-7-16 10:07
14#
发表于 2014-7-15 15:20:03 | 只看该作者
嗨,强哥! 发表于 2014-7-15 09:12
int main(int argc, char *argv[])
因为C语言我学的东西少,第一次见main()还带参数,能否简单讲解下 ...

第一个argc表示参数的数目
第二个**argv表示参数具体的字符串

例如一个命令
ipconfig /all
argc就是2
argv[0]访问到的就是 ipconfig这个字符串
argv[1]访问到的就是 /all这个字符串
15#
 楼主| 发表于 2014-7-16 10:10:46 | 只看该作者
rosynirvana 发表于 2014-7-15 15:17
最简单的方法是编译好后在命令行下运行

例如编译好的可执行文件名是foo.exe,然后文本文件是bar.txt, ...

十分感谢您的详细讲解,我来试试看。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

广播台
特别关注
快速回复 返回顶部 返回列表