請問專家如何將以下兩段程式合併?

a7258kimo 2009-05-22 04:26:11
此段程式是讀取一個檔案,然後將檔案一次從頭顯示到底

C/C++ code#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <ctype.h>
#include <io.h>

int main()
{
char filename[]="file.txt";
int handle;
int index=0,read_len;
char buffer[16];
int i;

if ( (handle = open(filename,O_RDONLY)) == -1) {
fprintf(stderr,"Can't open filename - %s\n",filename);
return 1;

}

while(1) {
printf("%08X ",index);
read_len = read(handle,(void *)buffer,16);
if (read_len <= 0)
break;

for(i=0;i<read_len;i++)
if (i%8 == 7)
printf("%02X ",buffer[i]);
else
printf("%02X ",buffer[i]);

printf(" |");

for(i=0;i<read_len;i++)
if (isprint(buffer[i]))
printf("%c",buffer[i]);
else
printf(".");

printf("|\n");

index+=read_len;

}

close(handle);
return 0;
}






此段是我寫到一半未完成的程式,我想把上面那段的顯示方式結合到底下的ALL SHOW功能裡頭,把他合併成開啟檔案後的其中一種功能來使用,我主要的目的是想要開啟一個檔案,然後可選擇一次顯示或是分頁顯示
就這兩段來說,可否請專家幫忙合併到一起,感謝感謝

C/C++ code#include <iostream>
#include <string>
#include <iomanip>
#include <fstream>
#include <conio.h>
#include <io.h>
using namespace std;

int main()
{
int handle=1;
int i;
int index=0,read_len;
char buffer[16];
int w,x;
string inputFileName;
ifstream inputFile;
cout << "輸入要開啟的檔名(包含副檔名):";
cin >> inputFileName;
inputFile.open (inputFileName.c_str(),ios::in);

while(inputFile.fail())
{
inputFile.clear();
cout << "無此檔,請重新輸入:";
cin >> inputFileName;
inputFile.open (inputFileName.c_str());
}
inputFile.seekg (0, ios::end);
int length = inputFile.tellg();
cout<<"************************************"<<endl;
cout<<setw(5)<<"開啟檔案:"<<inputFileName<<"\n檔案大小:"<<length<<"("<<hex<<length<<")"<<"bytes"<<endl;
cout<<"************************************"<<endl;
inputFile.seekg (0, ios::beg);
cout<<"=================="<<endl;
cout<<"1.Dump all file .\n"<<"2.Input start address ."<<endl;
cout<<"==================\n"<<"Select (1,2) :"<<endl;
w=getch();
if (w=1)
cout<<"1.ALL show\n"<<"2.PAGE show"<<endl;
x=getch();
switch (x%4)
{
case 1:
case 2:
}
return 0;
}

...全文
197 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
lzh9955 2009-05-25
  • 打赏
  • 举报
回复
高手!
a7258kimo 2009-05-25
  • 打赏
  • 举报
回复
請教ltc_mouse,可以幫忙解釋底下註解中code的意思嗎?
如果想把此CODE修改成:一次顯示一頁,然後提示PRESS ANY KEY來顯示下一頁,該如何修改?
感謝


while(1) {
read_len = 16;
inputFile.read(buffer, 16);
if (inputFile.eof())
{
inputFile.clear();
// read_len = (int)(inputFile.tellg()) - index;
if(read_len <= 0)
break;
}
// cout<<hex<<setfill('0')<<setw(8)<<index;
for(i=0;i <read_len;i++)
{
// cout<<' '<<hex<<setfill('0')<<setw(2)<<(int)((unsigned char)buffer[i]);
if(7 == i)
cout<<' ';
}

// cout<<setfill(' ')<<setw( 3+(read_len>7?(48-read_len*3):(49-read_len*3)) )<<'|';
for(i=0;i <read_len;i++)
// if (buffer[i]>0 && isprint(buffer[i]))
cout<<buffer[i];
else
cout<<'.';
cout<<"|"<<endl;

index+=read_len;
}
}
ltc_mouse 2009-05-25
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 a7258kimo 的回复:]
想在請教ltc_mouse一個問題
除了整頁顯示以及分頁顯示之外
如果我想指定顯示的起始位置,該怎麼做呢
比如:想從00001110位置處開始往下顯示
[/Quote]
inputFile.tellg()是得到文件当前位置的,那么相应的有个方法,seekg(pos)可以设置文件位置... 想从哪里开始显示,就把偏移量index初始化成那个值,然后调用inputFile.seekg(index)即可。

[Quote=引用 22 楼 a7258kimo 的回复:]
另外想請問ltc_mouse

關於這行
cout < <setfill(' ') < <setw( 3+(read_len>7?(48-read_len*3):(49-read_len*3)) ) < <'|';

您是怎麼思考出要如此撰寫的呢?
此行我實在是想不出原因
[/Quote]
呵呵,这条代码其实很丑陋,纯粹是想让右边的|...|输出看起来是对齐的~ 然而,read_len可能的值是1~16(大部分情况下是16,只有最后一行不同),这里的作用就是计算当read_len为不同值时,要填充几个空格后开始显示'|',才能对齐~~ 更清楚一点的应该是:

if(16 == read_len) //这是绝大多数情况
{
cout<<" |";
}
else
{
int blank = (16-read_len)*3 + 3 + (read_len>7?1:0); //每个byte输出2个字节+1个空格,最后空2个空格(3因为'|'要一个位置),第8、9字符之间多1个空格
cout<<setfill(' ')<<setw(blank)<<'|';
}
a7258kimo 2009-05-25
  • 打赏
  • 举报
回复
另外想請問ltc_mouse

關於這行
cout < <setfill(' ') < <setw( 3+(read_len>7?(48-read_len*3):(49-read_len*3)) ) < <'|';

您是怎麼思考出要如此撰寫的呢?
此行我實在是想不出原因
a7258kimo 2009-05-25
  • 打赏
  • 举报
回复
想在請教ltc_mouse一個問題
除了整頁顯示以及分頁顯示之外
如果我想指定顯示的起始位置,該怎麼做呢
比如:想從00001110位置處開始往下顯示
goodname 2009-05-25
  • 打赏
  • 举报
回复
if (x==50)//???
system("pause");
else
continue;
a7258kimo 2009-05-25
  • 打赏
  • 举报
回复
感謝ltc_mouse
我已經實現啦!!
a7258kimo 2009-05-25
  • 打赏
  • 举报
回复
to ltc_mouse:
您好,非常感謝您的回答,使我的疑惑解開不少,關於分頁顯示,我試了好久,請看以下我修改的方式
卻是一直沒辦法,實在不知道該從何下手,小弟學習C++僅一個星期時間,請見諒
我認為我修改的方式非常接近解答了,可否請專家提點? 非常感謝


while(1) { for(int x=1;x<=50;x++)
read_len = 16;
inputFile.read(buffer, 16);
if (inputFile.eof())
{
inputFile.clear();
read_len = (int)(inputFile.tellg()) - index;
if(read_len <= 0)
break;
}

cout<<hex<<setfill('0')<<setw(6)<<index;
for(i=0;i <read_len;i++)
{
cout<<' '<<hex<<setfill('0')<<setw(2)<<(int)((unsigned char)buffer[i]);
if(7 == i)
cout<<' ';
}

cout<<setfill(' ')<<setw( 3+(read_len>7?(48-read_len*3):(49-read_len*3)) )<<'|';
for(i=0;i <read_len;i++)
if (buffer[i]>0 && isprint(buffer[i]))
cout<<buffer[i];
else
cout<<'.';
cout<<"|"<<endl;
index+=read_len;

if (x=50)
system("pause");
else
continue;

}
}
ltc_mouse 2009-05-25
  • 打赏
  • 举报
回复
回楼主,关于分页显示,需要增加一个变量记录显示了多少行,当行满一页时,就提示用户按键到下一页, 这些判断可以添加在while(1)末尾处理文件位置的地方,自己动手尝试下~~
关于代码的疑问,在下面简单注释了,希望能看懂。但是,像cout<<hex<<setfill('0')<<setw(8)<<endl;这样的代码,你应该多查查资料的,C++ I/O的简单格式控制而已。

while(1) {
read_len = 16;
inputFile.read(buffer, 16);
if (inputFile.eof())
{
inputFile.clear();
//read_len是本次读取的数据长度,在遇到结尾前,都是16
//但遇到文件结尾了,就可能不是。所以通过tellg得到当前位置,减去index(已读数据长度),得到最后一次读的长度
read_len = (int)(inputFile.tellg()) - index;
if(read_len <= 0) //read_len为0了,所有数据已处理完,退出循环
break;
}
cout<<hex<<setfill('0')<<setw(8)<<index; //按16进制格式打印index,宽度为8,不足8位用0填充
for(i=0;i <read_len;i++)
{
cout<<' '<<hex<<setfill('0')<<setw(2)<<(int)((unsigned char)buffer[i]);
if(7 == i)
cout<<' ';
}

cout<<setfill(' ')<<setw( 3+(read_len>7?(48-read_len*3):(49-read_len*3)) )<<'|'; //setw判断read_len,主要为了处理最后一行
for(i=0;i <read_len;i++)
if (buffer[i]>0 && isprint(buffer[i])) //isprint判断是否为可打印字符,参数是int,而buffer[i]是char,先判断避免错误~
cout<<buffer[i];
else
cout<<'.';
cout<<"|"<<endl;

index+=read_len;
}

///对isprint补充说明下。由于读取二进制文件,有些字符ASCII码值在128~255之间,比如汉字的第一个字节,而buffer[i]是char类型的,
///此时将是一个负值,不加判断直接调用isprint似乎会引发这个函数运行时错误(个人估计是isprint查表时越界引起),因而加上buffer[i]>0。
///回过头看看,char buffer[16];这个数组的类型声明是不合适的,读二进制,应该用unsigned char。那就能省去isprint的判断,以及打印时(int)((unsigned char)buffer[i])这样的强转
ltc_mouse 2009-05-23
  • 打赏
  • 举报
回复
把第一段代码用C++的iostream翻译了下,并在第二段中调用,希望对lz有帮助~

#include <iostream>
#include <string>
#include <iomanip>
#include <fstream>
#include <conio.h>
using namespace std;

//以显示全部的模式显示文件inputFile
void DispFileShowAllMode(ifstream &inputFile)
{
int index=0,read_len;
char buffer[16];
int i;

while(1) {
read_len = 16;
inputFile.read(buffer, 16);
if (inputFile.eof())
{
inputFile.clear();
read_len = (int)(inputFile.tellg()) - index;
if(read_len <= 0)
break;
}
cout<<hex<<setfill('0')<<setw(8)<<index;
for(i=0;i <read_len;i++)
{
cout<<' '<<hex<<setfill('0')<<setw(2)<<(int)((unsigned char)buffer[i]);
if(7 == i)
cout<<' ';
}

cout<<setfill(' ')<<setw( 3+(read_len>7?(48-read_len*3):(49-read_len*3)) )<<'|';
for(i=0;i <read_len;i++)
if (buffer[i]>0 && isprint(buffer[i]))
cout<<buffer[i];
else
cout<<'.';
cout<<"|"<<endl;

index+=read_len;
}
}

int main( void )
{
int handle=1;
int index=0;
int w,x;
string inputFileName;
ifstream inputFile;
cout << "輸入要開啟的檔名(包含副檔名):";
cin >> inputFileName;
inputFile.open (inputFileName.c_str(),ios::in|ios::binary);
while(inputFile.fail())
{
inputFile.clear();
cout << "無此檔,請重新輸入:";
cin >> inputFileName;
inputFile.open (inputFileName.c_str(),ios::in|ios::binary);
}

inputFile.seekg (0, ios::end);
int length = inputFile.tellg();
cout <<"************************************" <<endl;
cout <<setw(5) <<"開啟檔案:" <<inputFileName <<"\n檔案大小:" <<length <<"(" <<hex <<length <<")" <<"bytes" <<endl;
cout <<"************************************" <<endl;
inputFile.seekg (0, ios::beg);

cout <<"==================" <<endl;
cout <<"1.Dump all file .\n" <<"2.Input start address ." <<endl;
cout <<"==================\n" <<"Select (1,2) :" <<endl;
w=getch();
if (w=='1')
{
cout <<"1.ALL show\n" <<"2.PAGE show" <<endl;
x=getch();
switch (x)
{
case '1':
DispFileShowAllMode(inputFile);
break;
case '2':
default:
break;
}
}
return 0;
}
lzh9955 2009-05-22
  • 打赏
  • 举报
回复
关注并学习
a7258kimo 2009-05-22
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 jixingzhong 的回复:]
把第一段代碼main改成一個普通的自定義函數,文件名以參數形式傳遞即可
[/Quote]

可以修改一次給我看嗎?,麻煩您了,我是真的新手
jixingzhong 2009-05-22
  • 打赏
  • 举报
回复
把第一段代码main改成一个普通的自定义函数,文件名以参数形式传递即可
a7258kimo 2009-05-22
  • 打赏
  • 举报
回复
感謝各位,我想大家都是中國人,這論壇對於想要學習語言的使用者應該都是抱持歡迎的角度吧

我的C++才剛學幾天,不懂C語言,所以對於各位的解答有些不知所措

是不是可以用簡單些的方式讓我明白?

第二段CODE的原意是,我想要讓使用者開啟檔案,然後把開啟的檔案使用第一段的顯示方法來執行

不知道這樣描述,各位同胞能夠理解我的問題嗎?
lingyin55 2009-05-22
  • 打赏
  • 举报
回复
把第一段的main函数名改掉,加个参数,在第二段需要用到的程序中调用就行。
具体楼上已经说了。因为两段的语言不同,直接在C++里面调用C函数,需要加上 extern “C”。

ps:也有可能是香港同胞...

[Quote=引用 3 楼 hikaliv 的回复:]
跑大陆的网来问……台湾没人了么?
[/Quote]
lori227 2009-05-22
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 ltc_mouse 的回复:]
楼主把第一段程序封装成一个函数,用文件流句柄做参数(或者简单点,用文件名作参数),在第二段的case 1中调用就可以了啊~

引用 3 楼 hikaliv 的回复:
跑大陆的网来问……台湾没人了么?

不能排挤台湾同胞,呵呵~~
[/Quote]
支持!
光宇广贞 2009-05-22
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 hikaliv 的回复:]
引用 4 楼 ltc_mouse 的回复:
楼主把第一段程序封装成一个函数,用文件流句柄做参数(或者简单点,用文件名作参数),在第二段的case 1中调用就可以了啊~

引用 3 楼 hikaliv 的回复:
跑大陆的网来问……台湾没人了么?

不能排挤台湾同胞,呵呵~~


欢迎还是来欢迎的。呵呵。
[/Quote]

欢迎还是来欢迎的。都是一家人的话那什么都好说,一家人不说两家话。

否则……呵呵……
光宇广贞 2009-05-22
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 ltc_mouse 的回复:]
楼主把第一段程序封装成一个函数,用文件流句柄做参数(或者简单点,用文件名作参数),在第二段的case 1中调用就可以了啊~

引用 3 楼 hikaliv 的回复:
跑大陆的网来问……台湾没人了么?

不能排挤台湾同胞,呵呵~~
[/Quote]

欢迎还是来欢迎的。呵呵。
liliangbao 2009-05-22
  • 打赏
  • 举报
回复
两段程序,分别使用C和C++
建议使用一种统一的风格~

你可以将第一段变成一个普通的函数,在第二个函数中调用即可,用不到所谓的合并了~
ltc_mouse 2009-05-22
  • 打赏
  • 举报
回复
楼主把第一段程序封装成一个函数,用文件流句柄做参数(或者简单点,用文件名作参数),在第二段的case 1中调用就可以了啊~

[Quote=引用 3 楼 hikaliv 的回复:]
跑大陆的网来问……台湾没人了么?
[/Quote]
不能排挤台湾同胞,呵呵~~
加载更多回复(3)
这个是完整源码 java实现 大数据 Spark 可视化大屏+Kafka+SpringBoot+Vue3 【大数据毕业设计】基于Spark实时社交媒体舆情分析与趋势预测(Java版本+可视化大屏+Kafka+SpringBoot+Vue3) 源码+论文 完整版 数据库Mysql 随着微博、抖音、知乎、小红书等社交媒体平台的快速发展,网络舆情呈现出数据规模大、传播速度快、情绪演化复杂等特点。传统离线批处理方式难以满足舆情监测对时效性的要求,亟需构建一套能够支撑实时采集、流式计算、情感分析与趋势预测的综系统。本文围绕“基于Spark实时社交媒体舆情分析与趋势预测”课题,设计并实现了一套前后端分离的舆情分析平台。系统后端采用Java语言与Spring Boot框架构建RESTful服务,结JWT完成管理员身份认证与权限控制;数据处理层引入Spark思想的流式窗口统计与Kafka消息缓冲机制,对社交媒体帖文进行情感倾向识别、热度指数计算和按小时窗口聚;趋势预测模块基于历史热度序列构建多元线性回归模型,输出未来窗口的热度预测值,并采用RMSE、MAE、MAPE等指标评价预测效果;前端采用Vue3、Vue Router、Pinia、Element Plus与ECharts实现管理后台与数据可视化大屏,支持帖文管理、话题管理、实时舆情查看、趋势对比和个人中心维护等功能。数据库选用MySQL,库名为db_social_opinion,核心业务表均以t_前缀命名,覆盖管理员、用户、平台、话题、帖文、实时统计、预测结果与误差指标等实体。测试结果表明,系统能够稳定完成舆情事件模拟、实时统计刷新与趋势预测展示,界面日期时间统一采用“2026-11-02 17:25:17”格式,满足本科毕业设计对完整性、规范性与可演示性的要求。本文工作对高校舆情教学实验、中小规模舆情监测系统原型开发具有一定

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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