主题:请教有关c语言的编程
正序浏览
主题图片汇总
主题内检索
浏览:1280 回帖:55
游客没有回帖权限
资深泡菜
泡网分: 29.148
主题: 320
帖子: 14158
注册: 2008年6月
不刀不舒服斯基 发表于 2018-4-6 10:57
这是c++的口号吧?


感觉C++就是在重复造轮子

例如字符串处理,继承了C语言的char*,有一大堆的strcpy一类的函数
然后windows API给定义了一大堆LPCWSTR LPSTR LPTSTR LPCTSTR之类刚接触时莫名其妙的定义,来管理不同的字符串。
C++标准库有std::string和std::wstring实现。
MFC又来了个CString实现。
QT又有个QString实现。

轮子不可谓不多啊。。。。
(0)
(0)
只看该作者
不看该作者
加入黑名单
举报
返回顶部
个人图文集
个人作品集
ChK
陈年泡菜
泡网分: 51.453
主题: 21
帖子: 12479
注册: 2003年1月
Netweaver 发表于 2018-04-06 06:53
哪有那么麻烦,readallline,一行命令把所有行读进一个数组,然后该怎么就怎么。

我说的是c#。

不同语言处理不同问题。底层开发用...
楼主既然问c,很可能运行环境特别简单,不知道是什么操作系统,也许是很简陋的
本帖由安卓客户端发布
(0)
(0)
只看该作者
不看该作者
加入黑名单
举报
返回顶部
个人图文集
个人作品集
禁言中
泡网分: 8.971
主题: 185
帖子: 5829
注册: 2012年2月
内容贡献勋章
哪有那么麻烦,readallline,一行命令把所有行读进一个数组,然后该怎么就怎么。

我说的是c#。

不同语言处理不同问题。底层开发用c,c++,应用层面用c#或Java更好,许多问题都有现成的库或函数。
本帖由安卓客户端编辑于:2018-04-06 14:57:18
(0)
(0)
只看该作者
不看该作者
加入黑名单
举报
返回顶部
个人图文集
个人作品集
泡菜
泡网分: 13.155
主题: 75
帖子: 14964
注册: 2014年7月
被引用内容作者已注销
这是c++的口号吧?
本帖由 LG-H818 客户端发布
(0)
(0)
只看该作者
不看该作者
加入黑名单
举报
返回顶部
个人图文集
个人作品集
资深泡菜
泡网分: 42.143
主题: 603
帖子: 13252
注册: 2007年9月
内容贡献勋章
ChK 发表于 2018-04-06 01:04
大块读二进制文件最快,文件操作附加动作很多,越细碎越慢,当然你的瓶颈未必在这个环节上
如果换行符不是特别多,读取中过滤省不了几个字节,反正你...


恩如果一行内容较完整,可以边读边处理

一行内容分布在几行中的话,还是读全好处理一些,代码可以简单一些

本帖由 google 客户端发布
(0)
(0)
只看该作者
不看该作者
加入黑名单
举报
返回顶部
个人图文集
个人作品集
ChK
陈年泡菜
泡网分: 51.453
主题: 21
帖子: 12479
注册: 2003年1月
笨蛋的笨蛋 发表于 2018-04-06 00:32
一个一个字节这样读,应该是最节约内存的了。。。

以后有机会试试。。

不知道从文件读取的话,比起读行来,

速度上(性能)是否有明显差...
大块读二进制文件最快,文件操作附加动作很多,越细碎越慢,当然你的瓶颈未必在这个环节上
如果换行符不是特别多,读取中过滤省不了几个字节,反正你都要读全才能处理
如果能从逻辑和算法上解决读全才能才处的问题,做到边读边处理,那就能省内存
本帖由安卓客户端发布
(0)
(0)
只看该作者
不看该作者
加入黑名单
举报
返回顶部
个人图文集
个人作品集
资深泡菜
泡网分: 42.143
主题: 603
帖子: 13252
注册: 2007年9月
内容贡献勋章
被引用内容作者已注销


一个一个字节这样读,应该是最节约内存的了。。。

以后有机会试试。。

不知道从文件读取的话,比起读行来,

速度上(性能)是否有明显差异?

本帖由 google 客户端发布
(0)
(0)
只看该作者
不看该作者
加入黑名单
举报
返回顶部
个人图文集
个人作品集
泡菜
泡网分: 15.939
主题: 0
帖子: 468
注册: 2006年12月
笨蛋的笨蛋 发表于 2018-4-5 20:13
这个想法也想过

回头来还是要处理一大串的字符串

所以就pass了

还是按照首贴写的那种方式,动态内存变量

今天简单跑了下,速度还挺快

这种东西速度方面是肯定没问题的, 但你不是要省内存吗...
至于处理字符串的问题, 不就价格计数器就能解决的嘛...
(0)
(0)
只看该作者
不看该作者
加入黑名单
举报
返回顶部
个人图文集
个人作品集
资深泡菜
泡网分: 42.143
主题: 603
帖子: 13252
注册: 2007年9月
内容贡献勋章
来碗炸酱面 发表于 2018-04-05 12:12
另外,尽量不要用malloc(MAX_BUF_LEN),那不是一个好的编程习惯。...


嗯,我这次的Maxbuflen是动态的

取决于每次文件内的每种内容的实际长度

基本上是0-200的范围,然后乘以每种内容的固定长度

本帖由 无忌论坛V3.1.0 iPhone6plus iOS10.3.3 客户端发布
(0)
(0)
只看该作者
不看该作者
加入黑名单
举报
返回顶部
个人图文集
个人作品集
资深泡菜
泡网分: 42.143
主题: 603
帖子: 13252
注册: 2007年9月
内容贡献勋章
kingsk 发表于 2018-04-05 11:03
读源文件,同时新建一个输出文件,把源文件的内容写入输出文件,碰到换行就忽略. 这样写malloc也省了,内存占用是极少的.
你如果要再处理...


这个想法也想过

回头来还是要处理一大串的字符串

所以就pass了

还是按照首贴写的那种方式,动态内存变量

今天简单跑了下,速度还挺快

本帖由 无忌论坛V3.1.0 iPhone6plus iOS10.3.3 客户端发布
(0)
(0)
只看该作者
不看该作者
加入黑名单
举报
返回顶部
个人图文集
个人作品集
泡菜
泡网分: 6.575
主题: 35
帖子: 6179
注册: 2011年2月
笨蛋的笨蛋 发表于 2018-4-5 07:49
目前有这样一个文件

多行,每行的长度不定,总长知道

需要把每一行都读到一起后,

再进行处理(以固定长度来切割)

现在想具体了解下,每一行读出拼成一个字符串的处理

大概笼统的知道是使用malloc分配一个总长的内存空间

然后把第一行放进去,然后移动指针,放下一行

指针这块具体的写法不是很清楚

希望大神们给出一个代码例子

谢谢各位大神


另外,尽量不要用malloc(MAX_BUF_LEN),那不是一个好的编程习惯。
(0)
(0)
只看该作者
不看该作者
加入黑名单
举报
返回顶部
个人图文集
个人作品集
泡菜
泡网分: 6.575
主题: 35
帖子: 6179
注册: 2011年2月
笨蛋的笨蛋 发表于 2018-4-5 07:49
目前有这样一个文件

多行,每行的长度不定,总长知道

需要把每一行都读到一起后,

再进行处理(以固定长度来切割)

现在想具体了解下,每一行读出拼成一个字符串的处理

大概笼统的知道是使用malloc分配一个总长的内存空间

然后把第一行放进去,然后移动指针,放下一行

指针这块具体的写法不是很清楚

希望大神们给出一个代码例子

谢谢各位大神


老将出马吧

#include "stdafx.h"
#include <sys/stat.h>
#include <malloc.h>

int main(int argc, char* argv[])
{
struct _stat fileInfo;
if(argc>1&&_stat( argv[1], &fileInfo) == 0 ){
char* pBuf = (char*)malloc(fileInfo.st_size);
if(pBuf!=NULL){
FILE* in = fopen(argv[0],"rb");
if(in!=NULL){
for(long lFileOff = 0,lOff=0;lFileOff<fileInfo.st_size;lFileOff+=lOff){
lOff = fread(pBuf+lFileOff,1,fileInfo.st_size-1024>=lFileOff?1024:fileInfo.st_size-lFileOff,in);
}
fclose(in);
/*处理代码搁这里*/
}
                        else
                             printf("打开文件%s错误.\n",argv[1]);
free(pBuf);
}
else
printf("分配内存错误.\n");
}
else
printf("获取文件信息错误.\n");
return 0;
}

如果是标准C,把所有的变量说明挪到最前面。不要用fseek,那个函数真要把整个文件读一遍,效率低。 本帖最后由 来碗炸酱面 于 2018-4-5 20:14 编辑

(0)
(0)
只看该作者
不看该作者
加入黑名单
举报
返回顶部
个人图文集
个人作品集
资深泡菜
泡网分: 29.148
主题: 320
帖子: 14158
注册: 2008年6月
笨蛋的笨蛋 发表于 2018-4-5 08:36
是的,文件真要是这么简单就好办了

这个文件结构大概是20年前设计的,用的某种basic语言实装(某知名大厂handy专用)

文件的不同内容之间的分隔符用的是改行(0a)

文件内有几种不同类型的内容,每种内容的长度是在文件里有

每一行长度不同是因为行的最大长4092是固定的,超过4092就换到新行,这样文件里有很多换行,跟分隔符用的是一样的0a

所以根据每种内容的总长,每一行来取,取得够长度后,处理,再进行下一种内容

我首贴写的就是每一种内容所需要做的读行,往内存里放,然后移动指针这块


那就先按照行读取,如果这一行长度是4092,那说明结尾的0a很有可能是你说的“换行”,删除这些换行符,那么剩下的0a就是分隔符了。
(0)
(0)
只看该作者
不看该作者
加入黑名单
举报
返回顶部
个人图文集
个人作品集
泡菜
泡网分: 15.939
主题: 0
帖子: 468
注册: 2006年12月
读源文件,同时新建一个输出文件,把源文件的内容写入输出文件,碰到换行就忽略. 这样写malloc也省了,内存占用是极少的.
你如果要再处理,直接处理输出文件就好了.
(0)
(0)
只看该作者
不看该作者
加入黑名单
举报
返回顶部
个人图文集
个人作品集
泡菜
泡网分: 0.168
主题: 4
帖子: 86
注册: 2016年9月
不懂,帮顶

本帖由 无忌论坛V3.1.0 iPhone5/5s iOS10.3.3 客户端发布
(0)
(0)
只看该作者
不看该作者
加入黑名单
举报
返回顶部
个人图文集
个人作品集
资深泡菜
泡网分: 42.143
主题: 603
帖子: 13252
注册: 2007年9月
内容贡献勋章
Silence1 发表于 2018-04-05 01:31
节省内存的方法一般是读一点就处理一点,不用等到文件结尾。

...


恩,这个昨天想过,打算试试

不过太麻烦了,基于这次的文件结构,需要判断的东西太多

还是按照同一内容全部整合后处理这种方法了

多谢
本帖由 google 客户端发布
(0)
(0)
只看该作者
不看该作者
加入黑名单
举报
返回顶部
个人图文集
个人作品集
泡菜
泡网分: 0.401
主题: 3
帖子: 581
注册: 2015年6月
笨蛋的笨蛋 发表于 2018-04-05 09:15
谢谢,这个写法跟我目前的差不多

看来只有这种了?

节省内存的方法一般是读一点就处理一点,不用等到文件结尾。
本帖由IOS客户端发布
(0)
(0)
只看该作者
不看该作者
加入黑名单
举报
返回顶部
个人图文集
个人作品集
资深泡菜
泡网分: 42.143
主题: 603
帖子: 13252
注册: 2007年9月
内容贡献勋章
Silence1 发表于 2018-04-05 00:56
很多年没有写C语言代码了,大致是这样吧:
====================================
pFile = fo...


谢谢,这个写法跟我目前的差不多

看来只有这种了?

本帖由 无忌论坛V3.1.0 iPhone6plus iOS10.3.3 客户端发布
(0)
(0)
只看该作者
不看该作者
加入黑名单
举报
返回顶部
个人图文集
个人作品集
泡菜
泡网分: 0.401
主题: 3
帖子: 581
注册: 2015年6月
很多年没有写C语言代码了,大致是这样吧:
====================================
pFile = fopen("filename");
sBuf = (char *)malloc(MAX_BUF_LEN);
iBufLen = 0;

if ( fgets( sLine,  MAX_LINE_LEN, pFile) != NULL )
{
   strcpy(sBuf+iBufLen, sLine);  
   iBufLen = iBufLen + strlen(sLine)-1; /* 长度要减去行尾的换行符 */
}
本帖最后由 Silence1 于 2018-4-5 08:57 编辑

(0)
(0)
只看该作者
不看该作者
加入黑名单
举报
返回顶部
个人图文集
个人作品集
资深泡菜
泡网分: 42.143
主题: 603
帖子: 13252
注册: 2007年9月
内容贡献勋章
yxwd 发表于 2018-04-05 00:26
兄弟,实际上文件中的换行就是0D0A这两个字符而已(unix系统例如安卓等只有一个),所以说文件的全部内容你可以视为只有一行,读的时候过滤掉...


是的,文件真要是这么简单就好办了

这个文件结构大概是20年前设计的,用的某种basic语言实装(某知名大厂handy专用)

文件的不同内容之间的分隔符用的是改行(0a)

文件内有几种不同类型的内容,每种内容的长度是在文件里有

每一行长度不同是因为行的最大长4092是固定的,超过4092就换到新行,这样文件里有很多换行,跟分隔符用的是一样的0a

所以根据每种内容的总长,每一行来取,取得够长度后,处理,再进行下一种内容

我首贴写的就是每一种内容所需要做的读行,往内存里放,然后移动指针这块

本帖由 无忌论坛V3.1.0 iPhone6plus iOS10.3.3 客户端编辑于:2018-04-05 08:38:31
(0)
(0)
只看该作者
不看该作者
加入黑名单
举报
返回顶部
个人图文集
个人作品集
资深泡菜
泡网分: 42.143
主题: 603
帖子: 13252
注册: 2007年9月
内容贡献勋章
Album2018 发表于 2018-04-05 00:19
基本步骤:
(1)用fopen函数打开文件
(2)用ftell函数移动文件指针到文件尾,获取文件大小
(3)用malloc函数分配内存...


是的,使用环境是小型手上设备,内存等硬件条件不高

能节约使用内存是第一位

实际文件上是有很多块不同类型的内容,

每块都是我上面说的那种情况

最终是把不同种类的组成不同的行,分别处理

本帖由 无忌论坛V3.1.0 iPhone6plus iOS10.3.3 客户端发布
(0)
(0)
只看该作者
不看该作者
加入黑名单
举报
返回顶部
个人图文集
个人作品集
泡菜
泡网分: 1.137
主题: 7
帖子: 774
注册: 2010年8月
兄弟,实际上文件中的换行就是0D0A这两个字符而已(unix系统例如安卓等只有一个),所以说文件的全部内容你可以视为只有一行,读的时候过滤掉回车换行符,然后在读到你需要的行长度后再加入回车换行即可,边读边写。为了节省io也可以设个写buffer
本帖由安卓客户端发布
(0)
(0)
只看该作者
不看该作者
加入黑名单
举报
返回顶部
个人图文集
个人作品集
泡菜
泡网分: 1.418
主题: 2
帖子: 1407
注册: 2018年3月
基本步骤:
(1)用fopen函数打开文件
(2)用ftell函数移动文件指针到文件尾,获取文件大小
(3)用malloc函数分配内存空间,内存块大小等于文件大小
(4)用ftell函数移动文件指针到文件起始位置
(5)用fread函数将整个文件读入前面分配的内存块中
(6)用fclose函数关闭文件
(7)写一个函数获取行分割符的位置
(8)循环读写内存块中的各行放入链表或数组中
(9)对行链表或数组进行处理。

上述步骤适合于对内存空间要求不高的场合。
(0)
(0)
只看该作者
不看该作者
加入黑名单
举报
返回顶部
个人图文集
个人作品集
泡菜
泡网分: 1.418
主题: 2
帖子: 1407
注册: 2018年3月
如果文件不是很大,简单的处理方案是把整个文件读入内存,按行间分割符分割成行,行存放在数组或链表中,最后对行进行处理即可。
(0)
(0)
只看该作者
不看该作者
加入黑名单
举报
返回顶部
个人图文集
个人作品集
资深泡菜
泡网分: 42.143
主题: 603
帖子: 13252
注册: 2007年9月
内容贡献勋章
这里人不多啊

发交流好了

本帖由 无忌论坛V3.1.0 iPhone6plus iOS10.3.3 客户端发布
(0)
(0)
只看该作者
不看该作者
加入黑名单
举报
返回顶部
个人图文集
个人作品集
资深泡菜
泡网分: 42.143
主题: 603
帖子: 13252
注册: 2007年9月
内容贡献勋章
目前有这样一个文件

多行,每行的长度不定,总长知道

需要把每一行都读到一起后,

再进行处理(以固定长度来切割)

现在想具体了解下,每一行读出拼成一个字符串的处理

大概笼统的知道是使用malloc分配一个总长的内存空间

然后把第一行放进去,然后移动指针,放下一行

指针这块具体的写法不是很清楚

希望大神们给出一个代码例子

谢谢各位大神

或者有其他好办法,节约内存的办法更好

本帖由 无忌论坛V3.1.0 iPhone6plus iOS10.3.3 客户端编辑于:2018-04-05 07:50:53
(0)
(0)
只看该作者
不看该作者
加入黑名单
举报
返回顶部
个人图文集
个人作品集
回复主题: 请教有关c语言的编程
功能受限
游客无回复权限,请登录后再试