Board logo

标题: [其他] 请教一个编程问题。。。。。如何实现由用户控制的文件输出格式??? [打印本页]

作者: waterking    时间: 2016-2-2 01:36     标题: 请教一个编程问题。。。。。如何实现由用户控制的文件输出格式???

因为不知道具体的通信协议,所以打印的时候需要用户根据实际情况配置。

举例来说,比如数组里有100个数据,打印到txt里。可以10个一行打10行,也可以5个一行打20行,可以浮点输出,也可以整形输出,由用户控制。。。

当然也不可能无条件的随意配置,只能尽量灵活吧。。。

C或C++实现,这种功能很难吗??求个思路。。。
作者: 藕是张力    时间: 2016-2-2 03:15

posted by wap, platform: iPad
读配置文件,或者做一个配置前台
作者: jun4rui    时间: 2016-2-2 07:29

posted by wap, platform: 小米 NOTE
这个看上去很简单啊,难吗?UI让用户选择每行个数,输出是整数还是浮点,后端根据用户选择输出就是了。
作者: lvcha    时间: 2016-2-2 08:26

posted by wap, platform: Firefox
引用:
原帖由 @waterking  于 2016-2-2 01:36 发表
因为不知道具体的通信协议,所以打印的时候需要用户根据实际情况配置。

举例来说,比如数组里有100个数据,打印到txt里。可以10个一行打10行,也可以5个一行打20行,可以浮点输出,也可以整形输出,由用户控制。。。

当然也不可能无条件的随意配置,只能尽量灵活吧。。。

C或C++实现,这种功能很难吗??求个思路。。。
这种的用脚本语言最合适了。python这些。
作者: jzhl    时间: 2016-2-2 08:41

posted by wap, platform: 小米 NOTE
你的整形浮点要精确到每个输出对象还是每行还是整个文本?
作者: ff_cactus    时间: 2016-2-2 09:03

posted by wap, platform: iPhone
引用:
原帖由 @lvcha  于 2016-2-2 08:26 发表
这种的用脚本语言最合适了。python这些。
用脚本未必比C/C++实现起来简单?
作者: ff_cactus    时间: 2016-2-2 09:14

posted by wap, platform: iPhone
你让用户打开记事本,自己写。
%d 表示整数,%f表示浮点数, \n表示换行,等等。
让后你把整个内容当成一个字符串,一个fprintf搞定。
作者: 总是注册不成功    时间: 2016-2-2 09:29

posted by wap, platform: iPhone
没看出难点在哪,把配置保存起来,输出的时候读取配置并用if else 硬撸有什么问题?
作者: waterking    时间: 2016-2-3 00:10

引用:
原帖由 ff_cactus 于 2016-2-2 09:14 发表
posted by wap, platform: iPhone
你让用户打开记事本,自己写。
%d 表示整数,%f表示浮点数, \n表示换行,等等。
让后你把整个内容当成一个字符串,一个fprintf搞定。
那岂不是我要写100个%d,%f这种,万一要是1W个数据呢。。。。。

就算我写了100个%d这种,后面难道再写100个a0,a1...a99??

还请赐教
作者: waterking    时间: 2016-2-3 00:10

引用:
原帖由 总是注册不成功 于 2016-2-2 09:29 发表
posted by wap, platform: iPhone
没看出难点在哪,把配置保存起来,输出的时候读取配置并用if else 硬撸有什么问题?
这样好像不太好。。。容易出错。。。调试也比较麻烦
作者: ff_cactus    时间: 2016-2-3 00:54

引用:
原帖由 waterking 于 2016-2-3 00:10 发表

那岂不是我要写100个%d,%f这种,万一要是1W个数据呢。。。。。

就算我写了100个%d这种,后面难道再写100个a0,a1...a99??

还请赐教
不是呀,假如用户输入的是:

My table
--------------
%d,    %f\n
%d,    %f\n

笨一点:
array_type array[100];
array_type *p = array;
char* format = read_file_content();
fprintf(output_f, format, p++, p++, p++, p++ .....);
当然这样做的话每次增加输出量就需要改。我想应该可以用那个什么arg_list宏之类的来替代后面的 p++ 等等。

不过你也可以写成循环。
你每次从用户文件那里读数据,直到读到一个%d或%f,然后调用printf,这样printf里面就一个打印参数了。要注意的是:1. 处理最后一个%d %f后面的内容。2. 文件要用append方式打开,或者你先写到缓存里。
感觉用C++写方便点。C的话申请内存比较麻烦。
作者: 性博士    时间: 2016-2-3 02:41

posted by wap, platform: Android
引用:
原帖由 @ff_cactus  于 2016-2-3 00:54 发表
不是呀,假如用户输入的是:

My table

%d,    %f

%d,    %f


笨一点:
array_type array;
array_type *p = array;
char* format = read_file_content();
fprintf(output_f, format, p++, p++, p++, p++ .....);
当然这样做的话每次增加输出量就需要改。我想应该可以用那个什么arg_list宏之类的来替代后面的 p++ 等等。

不过你也可以写成循环。
你每次从用户文件那里读数据,直到读到一个%d或%f,然后调用printf,这样printf里面就一个打印参数了。要注意的是:1. 处理最后一个%d %f后面的内容。2. 文件要用append方式打开,或者你先写到缓存里。
感觉用C++写方便点。C的话申请内存比较麻烦。
不需要改p++,每次只需要打印一个数就行,不加\n就不会换行,循环到把一行打印完,再单独打印一个\n

期间文件不用关闭,所以打开一次就可以,不用append

貌似这个需求根本不需要申请内存。如果只是配置文件里面的参数读入,直接声明一个小的静态字符串变量就可以。

本帖最后由 性博士 于 2016-2-3 02:44 通过手机版编辑
作者: zxsoft    时间: 2016-2-4 09:57

posted by wap, platform: MAC OS X
使用输出模板。
建立一个template.txt
比如你确定里面是矩阵型输出,里面这样写
items-per-row=10
template=%d
item-splitter=\t
line-splitter=\n
能看懂每个配置什么意思吧?读取这个配置文件,根据配置打印输出即可。
作者: SONIC3D    时间: 2016-2-5 03:10

从LZ的需求和编写能力上看,基本就是应该按照虚片上面所说的做就行了,这样是最快最实用的实现方式,应该足以满足需求。

如果要更复杂的格式输出,就得考虑xml结合xsd定义文件,但这只是在需求方明确提出要这样的时候你再朝这个方向去找资料,如果对方没提出,就绝对不建议搞那么复杂。
作者: sleepd    时间: 2016-2-5 09:05

posted by wap, platform: iPhone
根据你的描述,只需要让用户决定每行有几个数据这一个参数即可。




欢迎光临 TGFC Lifestyle (http://bbs.tgfcer.com/) Powered by Discuz! 6.0.0