C语言实用小技巧合集(持续更新)
1、几个常用的宏
#include <stdio.h> void main(void)
{printf("The file is %s.\n", __FILE__); //打印文件名(包含路径)printf("The date is %s.\n", __DATE__); //打印当前日期printf("The time is %s.\n", __TIME__); //打印当前时间printf("This is line %d.\n", __LINE__); //打印当前行号printf("This function is %s.\n", __FUNCTION__);//打印当前函数 system("pause");
}
这几个宏都是编译器自带的,可直接使用
2、perror函数
C 库函数 void perror(const char *str) 把一个描述性错误消息输出到标准错误 stderr。首先输出字符串 str,后跟一个冒号,然后是一个空格。常用于打开文件时的错误提示
#include <stdio.h>int main ()
{FILE *fp;/* 首先重命名文件 */rename("file.txt", "newfile.txt");/* 现在让我们尝试打开相同的文件 */fp = fopen("file.txt", "r");if( fp == NULL ) {perror("Error: ");return(-1);}fclose(fp);return(0);
}
输出结果:
Error: : No such file or directory
3、#define技巧
"#"用来把参数转换成字符串,是给参数加上双引号。
"##"则用来连接前后两个参数,把它们变成一个参数,
"#@"是给参数加上单引号,将参数字符化
#define CAT(x,y) x##y /* CAT(1,"abc") => "1abc" */
#define TOCHAR(a) #@a /* TOCHAR(1) => '1' */
#define TOSTRING(x) #x /* TOSTRING(1) => "1" */
此条转自:https://blog.csdn.net/longlongago2000/article/details/7590035
4、标准输出
printf可以输出固定长度的数据,使得输出的数据规范美观
对于fprintf也同样适用,保存数据也规范
printf("this is :%10d\n", 10); //输出数字占十位宽,右对齐
printf("this is :%-10d\n", 10); //输出数字占十位宽,左对齐
‘\n’是换行输出
'\r'在本行覆盖输出,若上次输出比本次长则会保留部分上次的输出信息
5、内存开辟
当需要处理的数据量较大时,平时常用的数组已经不能满足要求。因为数组使用的内存空间是栈(stack),它的空间有限,直接使用普通的方式定义大数组会导致溢出。这时候需要人为开辟内存空间,人为开辟的内存空间位于堆区,它能够满足数据量较大时的计算任务
人为开辟内存空间需要使用malloc函数,如下所示开辟了一段长度为length的char型内存空间:
char *p=NULL;p = malloc(length*sizeof(char));
需要注意的是malloc函数开辟的内存空间并不会对这块内存进行初始化,该内存的数据还是程序上一次使用这段内存是的数据。
实际使用时我们往往需要将内存初始化为0,这时我们可以使用calloc函数,calloc函数和malloc函数的参数传递稍微有点区别:
char *p=NULL;p = malloc(length,sizeof(char));
calloc函数有两个参数,分别是最小内存单元的数量和最小内存单元的大小
要使用calloc函数需要包含头文件
#include <malloc.h>
最后 需要重点注意的是不管是malloc还是calloc函数,在程序结束之前必须进行内存释放
free(p);
6、文件读取
为题描述:需要从一个二进制文件中读取整形数据,每个整形数据的长度是两个字节,数据量很大
一开始想到的是使用fscanf函数,从文件中直接格式化输入整形数据 如下
int temp;
fscanf(fp,"%d",temp);
这种读取方式最后读取出来的是乱码,因为%d格式是读取整形数据的,而文件中的数据严格来说是短整型的,然而也没有格式化读入短整型的方式,所以得另想办法
最后想到使用fread函数读取两个字节长的内存,然后再借用一个短整型变量做中转,再进行后续处理。并且这个中转变量也必须是short类型的,如果这个变量是int类型的,最后读出来的数据也是乱码
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
fread 函数从 stream 所标示的文件中读取数据, 一块是 size 个字节, 共 nmemb 块, 存放到 ptr 指向的内存里
返回实际读到的块数
FILE *fp;
short temp;
fp = fopen("45000_mod.dat", "rb");
if (fp == NULL)printf("Can't open this file");
fseek(fp, 8150000 * 2, 0);//去掉前面无用的信号
for (i = 0; i < DAT_LEN; i++)
{fread(&temp, 2, 1, fp);data[i].real = (double)(temp);
}
fclose(fp);
7、free问题
#include <stdio.h>
#include <malloc.h>#define FILELEN 10240typedef struct _Complex_f_ {float real;float imag;
}Complex_f;void main(void)
{Complex_f *data[10];data[0] = malloc(sizeof(Complex_f)*FILELEN);FILE *fp;fopen_s(&fp, "signal.bin", "rb");for (int i = 0; i < FILELEN; i++)fread(data[0]+i, sizeof(Complex_f), 1, fp);fclose(fp);fopen_s(&fp, "outdat.bin", "wb");for (int i = 0; i < FILELEN; i++)fwrite(data[0] + i, sizeof(Complex_f), 1, fp);fclose(fp);free(data[0]);//!!!getchar();
}
Complex_f *data[10];
使用这种方式定义的指针常用于保存名字等用途,在使用malloc为data分配内存的时候需要一次为data[i]分配内存
释放内存的时候也要依次释放data[i]
8、Expression: (stream != NILL)错误
Expression: (stream != NILL)错误基本都是由文件操作错误引起的,像fopen(),fread(),fprintf()等地方需要重点检查,还有就是fopen的打开方式,比如说需要读文件时候用的是wb方式而写文件用的是rb方式,这也能引发这个错误
这个错误也出现在文件夹不存在的时候,比如要往这个路径写数据时
sprintf_s(name, 100, "..\\signal\\allFrames\\%s_%03d.dat", type[i],aa[i]);
signal文件夹已经存在,但是allFrames文件夹并不存在,这样就会产生这个错误
C语言实用小技巧合集(持续更新)相关推荐
- android - 小技巧合集(不断更新)
1.不同条件显示不同图片 有时候,我们为了在一个image view中显示不同的图片,往往会使用: if (条件1) { image.setBackground(R.id.xxx1); } ...
- AWD 资源小合集(持续更新)
Github资源 (⭐235) AWD攻防赛脚本集合: https://github.com/admintony/Prepare-for-AWD (⭐124) Attack-Defense-Frame ...
- 【linux】vim操作小技巧合集 vim命令如何使用教程
vim命令 修改配置文件命令: # 打开 vim 文件名# 由普通模式进入命令模式 ( centos中) shift 和 : 一起按 ,例如不保存 输入q!i : 编辑命令(insert) 进入编辑模 ...
- 后端常用开源组件合集(持续更新中)
1. 常用库 awesome - golang开源库集合 2. 编码规范 cppguide - C++编码规范 CodeReviewComments - go code review建议 3. 敏捷开 ...
- Windows 操作小技巧 之一(持续更新)
1.图片批量旋转 通常携带单反去景点排了大量照片回来处理图片时都会遇到很多横竖杂乱排序的图片难以处理的情形.现提供如下技巧进行处理. 1).在文件夹中添加"方向"的排列或分组选项: ...
- python 团体程序设计天梯赛L1合集(持续更新)
试题列表 L1-001 Hello World L1-002 打印沙漏 L1-003 个位数统计 L1-004 计算摄氏温度 L1-005 考试座位号 L1-006 连续因子 L1-007 念数字 L ...
- hihoCoder简单问题合集[持续更新中]
1151:提补交卡 提取主要信息:得到最长连续天数 在一张补交卡提交之后,总能得到比之前所有连续天数更长的数据. 简单来说,我们需要明白,这里的连续天数是如何求到的.显然,两个连续出现的未签到日期的序 ...
- (C++)异常退出情况合集(持续更新中)
1.一个有输入的程序,还没做任何输入就自己运行结束了 原因:将长度为10的6次方的整型数组定义在main函数内 2.点击编译运行,显示源文件未编译 原因:定义了一个10的9次方长度的整型数组(虽然在m ...
- PAT甲级排队问题合集 (持续更新中)
已加入的习题 A1014,A1017 问题1和2共性 1. 都是排队问题 2. 都有一条黄线 3. 都需要找到最先离开人的队伍 4. 都有着服务时间段限制(迟于某个时间点来不予受理) 问题1:1014 ...
最新文章
- 简述计算机科学的核心内容,北京大学-计算机科学与技术(2018秋)作业及复习
- 比特币挖矿——区块链技术
- 构建聊天机器人:检索、seq2seq、RL、SeqGAN
- Java中的occur_time,PLSQL报错: ORA-12170:TNS connect timeout occurred
- python list常用方法_Python中列表(List)的基本用法
- opencv 模板匹配_详细剖析模板匹配
- linux 历史命令快捷键,Linux历史命令及bash快捷键
- 普通的PHP上传到云函数,php封装上传函数代码示例
- 银行工作的你压力大吗?待遇还好吗?
- 原来竟然还有这种局部变量!
- php 实现联想式 搜索,php实现联想搜索,你会吗?_后端开发
- warning: malformed '#pragma pack(pop[, id])' - ignored
- mysql的读写分离工具_mysql 读写分离工具
- 分享一个影视解析接口
- android实现推特Twitter分享
- Unix平台下的常用命令技巧之资源与性能
- 【python】Python报错:RecursionError: maximum recursion depth exceeded in comparison
- 软考(一)——数据流图
- 政府赠予固定资产或者捐赠资金的会计分录
- T120624 哪有那么花里胡哨这题就叫徐悦然哈哈哈