打印自身的程序

原创 2006年05月29日 06:47:00

闲来没事,想起还有这样一个玩意,所以就做了,不知道符合要求不-,-

记得以前有个很短的,不过无法通过编译=。=


// File Name : print_self.cpp
// Author : keakon
// Create Date : 2006/5/27
// Last Edited Date : 2006/5/28
// Description : Print its own source code in stdout.

#include <algorithm>
//#include <cstdlib> //rand()和srand()需要,但<algorithm>和<fstream>已包含
#include <ctime>
#include <fstream>
#include <iostream>
//#include <iterator> //ostream_iterator需要,但<algorithm>已包含
#include <string>

using namespace std;

string& getCppPath(string& path)
//若只传递const char**型的参数,则必须返回一个string
//或一个static的string&,这都是无谓的开销
//若传递string&型的参数,则最好传递前就用char*初始化,因此无需其他参数
//返回string&是让其可以嵌套在其他参数为string&或string的函数中使用

//这个函数做了5个假设:
//1是可执行文件和源程序的文件名相同(不包括后缀名)
//2是路径用“/”作为分隔符,可以改为“/”在UNIX和Linux下使用
//3是将最后一个“.”作为该可执行文件后缀名的开始
//4是源程序路径为“./”,即当前工程的文件夹下
//5是该源程序的后缀名为.cpp

//可见这个程序大部分都是判断得出文件名,若允许给main()传递参数的话,就简单多了
{
 typedef string::size_type str_sz;

 const char PATH_DIVIDER[] = "//";
 str_sz index = path.rfind(PATH_DIVIDER); //找最后一个“/”
 const str_sz BEGIN = 0;
 index = (index == string::npos) ? BEGIN : ++index;
 //若没找到则index为0,否则加1去掉“/”
 path.erase(BEGIN, index); //去掉“/”之前的字符

 const char SUFFIX_BEGIN[] = ".";
 index = path.rfind(SUFFIX_BEGIN); //找最后一个“.”
 if (index == string::npos)
  {index = path.size();}
 //若没找到则index为最后的元素后面
 //感觉返回npos很麻烦,为什么不像STL中返回最后一个后面的索引呢=。=
 path.erase(index, path.size() - index); //去掉“.”之后的字符

 const string PATH(".//");
 //默认路径名,因为在VC++6.0中,源程序在当前工程的文件夹下
 //这个不加也行,因为默认就是当前文件夹
 const string SUFFIX(".cpp");
 //默认后缀名,因为在VC++6.0中,C++源程序的后缀名为.cpp
 path = PATH + path + SUFFIX; //补充文件名的路径和后缀名

 return path;
}

void print0(istream& in)
{
 string buf;
 while (getline(in, buf))
  //文件打开失败也没有危害,因为只是简单地返回false退出循环
  //唯一的缺点是没有提示出错罢了,所以我不检查in了
  //这句改成getline(in, buf, '/0')一次读取完文件,理论上可行
  //这假设了文件中未使用'/0'字符,且文件大小不超过64k
  //因为string对象的最大字符数为64k
 {
  buf += '/n'; //getline丢弃了换行符,需要添加
  copy(buf.begin(), buf.end(), ostream_iterator<char>(cout));
  //输出一行内容到cout
 }
}

void print1(istream& in)
//print0()也可改为用char处理
{
 const streamsize BUF_SIZE = 1024;
 char buf[BUF_SIZE];
 while (in.getline(buf, BUF_SIZE))
  {cout << buf << endl;}
}

void print2(istream& in)
//print1()也可以用copy来实现
{
 const streamsize BUF_SIZE = 1024;
 char buf[BUF_SIZE];
 while (in.getline(buf, BUF_SIZE))
 {
  char* pc = find(buf, buf + BUF_SIZE, '/0');
  //找字符串的结尾('/0')
  *pc = '/n'; //修改为换行以输出
  copy(buf, pc + 1, ostream_iterator<char>(cout));
  //pc + 1为结束边界
 }
}

int main(int argc, char** agrv)
{
 string path(*agrv); //将可执行文件的路径保存为path字符串

 ifstream in(getCppPath(path).c_str());
 //从path中提取cpp文件路径,然后转化为C风格的字符串用以打开文件

 void (* print[3])(istream&); //定义一个函数指针数组
 print[0] = print0;
 print[1] = print1;
 print[2] = print2;

 srand(time(0));
 print[rand() % 3](in); //随机选择一个函数运行

 in.close();

 return 0;
}

编写一个程序以确定分别由signed及unsigned限定的char、short、int及long类型变量的取值范围。采用打印标准头文件中的相应值以及直接计算两种方式实现

采用打印标准头文件中的相应值: #include #include //determine ranges of types int main() { printf("采用打印标准头文件limits...

编写程序,循环接收用户从键盘输入多个字符串,直到输入“end”时循环结束,并将所有已输入的字符串按字典顺序倒序打印。

编写程序,循环接收用户从键盘输入多个字符串,直到输入“end”时循环结束,并将所有已输入的字符串按字典顺序倒序打印。package com.itheima; import java.lang.ref...

在C/C++程序中打印当前函数调用栈

在C/C++程序中打印当前函数调用栈 2011年6月11日小武哥发表评论阅读评论       前几天帮同事跟踪的一个程序莫名退出,没有core dump(当然ulimit是打开...
  • rheostat
  • rheostat
  • 2013年01月21日 09:50
  • 13425

写一个程序,分析一个文本文件中各个词出现的频率,并且把频率最高的10个词打印出来。文本文件大约是30KB~300KB大小。

解决步骤:   1、读取一个 txt 文本文件;         2   3、统计文件里面每个词出现的次数;   4、进行排序,打印出频率最高的10个词。...

编写程序tail,将其输入中的最后n行打印出来。

默认情况下,n的值为10,可通过可选参数改变n的值,命令tail -n将打印其输入的最后n行。#include #include #include #define DEFLINS 10 #defi...

Android使用XLog打印与收集程序运行详细日志

开源项目XLog的介绍及使用
  • cc_want
  • cc_want
  • 2015年09月09日 19:41
  • 1429

用汇编语言编写程序打印ASCII表

打印一个ASCII表在高级程序设计语言中是一个非常简单的程序,但是用汇编又该如何编写呢? 一、设计思路 我们可以按15行*16列的表格形式显示ASCII码为10H一100H的所有字符,即以行为主的...
  • ljianhui
  • ljianhui
  • 2013年12月12日 01:45
  • 11626

JAVA程序设计(18.2)----- 5条线程按照给定规律轮流打印 线程调度 线程池 synchronized wait notify

这次没有使用 有名内部类 将程序控制数据、执行程序都独立出来了  5条线程按照给定规律轮流打印 线程调度 线程池 synchronized wait notify 代码如下: 1.独立出来的...
  • Anubies
  • Anubies
  • 2014年11月23日 18:40
  • 509

练习1-14 编写一个程序,打印输入中各个字符出现频度的直方图(水平)

C语言程序设计(第二版) 练习1-14 个人设计编写一个程序,打印输入中各个字符出现频度的直方图(水平)代码块#include main() { int c, nletter, nwhit...

用C语言编写程序打印一朵玫瑰花

用C语言编写程序打印一朵玫瑰花,需要使用graphics.h
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:打印自身的程序
举报原因:
原因补充:

(最多只允许输入30个字)