int main(int argc,char* argv[]) & fopen & fseek

argc是命令行总的参数个数   
   argv[]是argc个参数,其中第0个参数是程序的全名,以后的参数命令行后面跟的用户输入的参数,比如:   
   int  main(int argc,  char* argv[])   
   {   
       int   i;   
       for (i = 0; i<argc; i++)   
            cout<<argv[i]<<endl;   
       cin>>i;  

 
       return   0;   
   }   
   执行时敲入   
   F:/MYDOCU~1/TEMPCODE/D1/DEBUG/D1.EXE   aaaa   bbb   ccc   ddd   
   输出如下:   
   F:/MYDOCU~1/TEMPCODE/D1/DEBUG/D1.EXE   
   aaaa   
   bbb   
   ccc   
   ddd   
--------------------------------------------------------------------
char  *argv[]是一个字符数组,其大小是int  argc,主要用于命令行参数  argv[]  参数,数组里每个元素代表一个参数;
比如你输入   
   test   a.c   b.c   t.c   
   则   
   argc   =   4   
    
   argv[0]   =   "test"   
   argv[1]   =   "a.c"   
   argv[2]   =   "b.c"   
   argv[3]   =   "t.c"


exit()是程序退出时的返回码。可以用其他程序接收,判断是否正常退出。如exit(-1)认为异常退出。


函数名称:     fopen
函数原型:     FILE *fopen(char * filename,char * mode);
函数功能:     以mode指定的方式打开名为filename的文件
函数返回:     成功,返回一个文件指针(文件信息区的起始地址),否则返回0
参数说明:     filename-文件名称,mode-打开模式:
                  r   只读方式打开一个文本文件
                  rb  只读方式打开一个二进制文件
                  w   只写方式打开一个文本文件
                  wb  只写方式打开一个二进制文件
                  a   追加方式打开一个文本文件
                  ab  追加方式打开一个二进制文件
                  r+  可读可写方式打开一个文本文件
                  rb+ 可读可写方式打开一个二进制文件
                  w+  可读可写方式创建一个文本文件
                  wb+ 可读可写方式生成一个二进制文件
                  a+  可读可写追加方式打开一个文本文件
                  ab+ 可读可写方式追加一个二进制文件

函数功能  用来读写一个数据块。

一般调用形式

  fread(buffer,size,count,fp);

  fwrite(buffer,size,count,fp);

  (1)buffer:是一个指针,对fread来说,它是读入数据的存放地址。对fwrite来说,是要输出数据的地址。

  (2)size:要读写的字节数;

  (3)count:要进行读写多少个size字节的数据项;

  (4)fp:文件型指针。



fseek()函数

 


0001.gif (1095 字节)

    调用形式


  #include"stdio.h"

  fseek(文件类型指针fp,位移量,起始点)

    函数功能把与fp有关的文件位置指针放到一个指定位置。

    其中,“位移量”是long型数据,它表示位置指针相对于“起始点”移动的字节数。如果位移量是一个正数,表示从“起始点”开始往文件尾方向移动;如果位移量是一个负数,则表示从“起始点”开始往文件头方向移动。

    “起始点”不能任意设定,它只能是在stdio.h中定义的三个符号常量之一:

起始点

对应的数字

  代表的文件位置

SEEK_SET

0   文件开头

SEEK_CUR

1   文件当前位置

SEEK_END

2   文件末尾

    例如:

        fseek(fp,50L,0);或fseek(fp,50L,SEEK_SET);

    其作用是将位置指针移到离文件头50个字节处。

 


#include &lt;stdio.h&gt; #include &lt;sys/types.h&gt; #include &lt;sys/stat.h&gt; #include &lt;fcntl.h&gt; #include &lt;unistd.h&gt; #include &lt;stdlib.h&gt; #include &lt;string.h&gt; #include &lt;strings.h&gt; #include &lt;termios.h&gt; #include &lt;pthread.h&gt; //串口初始化功能函数,fd:串口驱动设备的文件描述符 int tty_init(int fd) { //串口参数结构体 struct termios old_uart,new_uart; //清空结构体变量内容,memset bzero(&amp;old_uart,sizeof(struct termios)); bzero(&amp;new_uart,sizeof(struct termios)); //获取串口属性,旧的串口 tcgetattr(fd,&amp;old_uart); //设置原始属性,重新设置属性 cfmakeraw(&amp;new_uart); //激活本地连接CLOCAL与接收使能CREAD的选项 new_uart.c_cflag |= CLOCAL|CREAD; //设置输出、输入波特率 cfsetospeed(&amp;new_uart, B115200); cfsetispeed(&amp;new_uart, B115200); //设置数据位为8位 new_uart.c_cflag &amp;= ~CSIZE; new_uart.c_cflag |= CS8; //无校验位 new_uart.c_cflag &amp;= ~PARENB; //1个停止位 new_uart.c_cflag &amp;= ~CSTOPB; //设置等待时间、最小接收字符个数 new_uart.c_cc[VTIME] = 0; new_uart.c_cc[VMIN] = 1; new_uart.c_lflag &amp;= ~(ICANON | ECHO | ECHOE | ISIG); //本地模式设置为原始模式 //清空缓冲区 tcflush(fd,TCIOFLUSH); //设置串口属性到文件中 -- 生效属性 tcsetattr(fd, TCSANOW,&amp;new_uart); return 0; } void *BLE_Send(void *arg) { int ble_fd = *(int *)arg; //获取文件描述符 char *s_msg = (char *)malloc(1024); //申请写入数据的空间 while(1) { printf(&quot;send:&quot;); //从键盘输入数据保存到msg中 fgets(s_msg,1024,stdin); write(ble_fd,s_msg,strlen(s_msg)); //写数据 if(strncmp(s_msg,&quot;quit&quot;,4)==0) { memset(s_msg,0,1024); break; } //清空内存 memset(s_msg,0,1024); } //释放堆空间 free(s_msg); } void *BLE_Recv(void *arg) { int ble_fd = *(int *)arg; //获取文件描述符 char *r_msg = (char *)malloc(1024); //申请接收数据的空间 while(1) { //读取串口接收的数据 read(ble_fd,r_msg,1024); printf(&quot;recv:%s\n&quot;,r_msg); if(strncmp(r_msg,&quot;quit&quot;,4)==0) { memset(r_msg,0,1024); break; } //清空内存 memset(r_msg,0,1024); } //释放堆空间 free(r_msg); } int main(int argc,char *argv[]) { pthread_t ble_tid1=0,ble_tid2=0; //访问串口1驱动 int ble_fd = open(&quot;/dev/ttySAC1&quot;,O_RDWR); if(ble_fd==-1) { printf(&quot;open BLE error...\n&quot;); return -1; } //串口初始化 tty_init(ble_fd); //串口数据读写线程 pthread_create(&amp;ble_tid1,NULL,BLE_Send,(void *)&amp;ble_fd); pthread_create(&amp;ble_tid2,NULL,BLE_Recv,(void *)&amp;ble_fd); //接合线程 pthread_join(ble_tid1,NULL); pthread_join(ble_tid2,NULL); //关闭文件 close(ble_fd); return 0; }用c语言修改代码:使用蓝牙通信,手机发送&ldquo;prev&rdquo;显示上一张图片,发送&quot;next&quot;显示下一张图片
最新发布
07-14
#include &lt;glut.h&gt; #include &lt;GL/gl.h&gt; #include &lt;GL/glu.h&gt; #include &lt;stdio.h&gt; #include &lt;math.h&gt; #include&lt;iostream&gt; #define GL_BGR 0x80E0 // 扩展的BGR颜色格式 #define M_PI 3.14159265358979323846 // 纹理ID GLuint skyTexture, roadTexture, wheelTexture, carTexture; // 小车位置和车轮旋转角度 float carPosition = -1.0f; float wheelRotation = 0.0f; // 改进的BMP文件加载函数 GLuint loadBMP(const char* filename) { FILE* file; errno_t error = fopen_s(&amp;file, filename, &quot;rb&quot;); // 使用二进制模式打开文件 if (error != 0 || file == nullptr) { std::cerr &lt;&lt; &quot;无法打开文件: &quot; &lt;&lt; filename &lt;&lt; std::endl; return 0; } // 读取BMP文件头 unsigned char header[54]; if (fread(header, 1, 54, file) != 54) { std::cerr &lt;&lt; &quot;无效的BMP文件头: &quot; &lt;&lt; filename &lt;&lt; std::endl; fclose(file); return 0; } // 检查是否为BMP文件 if (header[0] != &#39;B&#39; || header[1] != &#39;M&#39;) { std::cerr &lt;&lt; &quot;不是BMP文件: &quot; &lt;&lt; filename &lt;&lt; std::endl; fclose(file); return 0; } // 获取图像数据的偏移量 int dataPos = *(int*)&amp;(header[0x0A]); // 获取图像大小 int imageSize = *(int*)&amp;(header[0x22]); // 获取图像宽度和高度 int width = *(int*)&amp;(header[0x12]); int height = *(int*)&amp;(header[0x16]); // 如果BMP文件没有提供图像大小,则计算它 if (imageSize == 0) imageSize = width * height * 3; // 3表示RGB // 如果数据位置未指定,则使用默认值 if (dataPos == 0) dataPos = 54; // BMP文件头的大小 // 为图像数据分配内存 unsigned char* data = new unsigned char[imageSize]; // 读取图像数据 fseek(file, dataPos, SEEK_SET); fread(data, 1, imageSize, file); fclose(file); // 创建纹理ID GLuint textureID; glGenTextures(1, &amp;textureID); // 绑定纹理 glBindTexture(GL_TEXTURE_2D, textureID); // 加载纹理数据到OpenGL glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_BGR, GL_UNSIGNED_BYTE, data); delete[] data; // 设置纹理过滤 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); return textureID; } // 绘制带纹理的矩形 void drawTexturedQuad(float x, float y, float width, float height) { glBegin(GL_QUADS); glTexCoord2f(0.0f, 0.0f); glVertex2f(x, y); glTexCoord2f(1.0f, 0.0f); glVertex2f(x + width, y); glTexCoord2f(1.0f, 1.0f); glVertex2f(x + width, y + height); glTexCoord2f(0.0f, 1.0f); glVertex2f(x, y + height); glEnd(); } // 绘制带纹理的旋转车轮 void drawWheel(float cx, float cy, float radius) { glPushMatrix(); // 移动到车轮中心并应用旋转 glTranslatef(cx, cy, 0.0f); glRotatef(wheelRotation, 0.0f, 0.0f, 1.0f); const int segments = 36; glBegin(GL_TRIANGLE_FAN); glTexCoord2f(0.5f, 0.5f); // 中心点 glVertex2f(0.0f, 0.0f); for (int i = 0; i &lt;= segments; i++) { float angle = 2.0f * M_PI * i / segments; float x = cos(angle) * radius; float y = sin(angle) * radius; // 计算纹理坐标 glTexCoord2f(0.5f + 0.5f * cos(angle), 0.5f + 0.5f * sin(angle)); glVertex2f(x, y); } glEnd(); glPopMatrix(); } // 绘制小车 void drawCar() { // 车身 (矩形) glColor3f(1.0f, 1.0f, 1.0f); // 确保颜色为白色,不影响纹理颜色 glBindTexture(GL_TEXTURE_2D, carTexture); drawTexturedQuad(carPosition - 0.2f, -0.5f, 0.4f, 0.2f); // 车轮 glBindTexture(GL_TEXTURE_2D, wheelTexture); drawWheel(carPosition - 0.15f, -0.55f, 0.07f); // 左轮 drawWheel(carPosition + 0.15f, -0.55f, 0.07f); // 右轮 } // 场景渲染函数 void renderScene() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 绘制天空 glBindTexture(GL_TEXTURE_2D, skyTexture); drawTexturedQuad(-1.0f, -1.0f, 2.0f, 2.0f); // 绘制道路 glBindTexture(GL_TEXTURE_2D, roadTexture); drawTexturedQuad(-1.0f, -1.0f, 2.0f, 0.5f); // 绘制小车 drawCar(); glutSwapBuffers(); } // 动画更新函数 void update(int value) { // 更新小车位置(水平移动) carPosition += 0.01f; if (carPosition &gt; 1.2f) carPosition = -1.2f; // 更新车轮旋转角度(顺时针旋转) wheelRotation -= 5.0f; if (wheelRotation &gt; 360.0f) wheelRotation += 360.0f; // 触发重绘 glutPostRedisplay(); glutTimerFunc(16, update, 0); // 约60FPS } // 初始化函数 void init() { // 设置清除颜色为白色(背景色) glClearColor(1.0, 1.0, 1.0, 0.0); // 加载纹理 skyTexture = loadBMP(&quot;sky.bmp&quot;); roadTexture = loadBMP(&quot;road.bmp&quot;); wheelTexture = loadBMP(&quot;wheel.bmp&quot;); carTexture = loadBMP(&quot;car.bmp&quot;); // 检查纹理是否加载成功 if (!skyTexture || !roadTexture || !wheelTexture || !carTexture) { std::cerr &lt;&lt; &quot;纹理加载失败!请确保所有BMP文件都在正确的位置。&quot; &lt;&lt; std::endl; } // 启用纹理和混合 glEnable(GL_TEXTURE_2D); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // 设置2D正交投影 glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(-1.0, 1.0, -1.0, 1.0); glMatrixMode(GL_MODELVIEW); // 设置背景色 glClearColor(0.0f, 0.0f, 0.0f, 1.0f); } int main(int argc, char** argv) { // 初始化GLUT glutInit(&amp;argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); glutInitWindowSize(800, 600); glutCreateWindow(&quot;OpenGL 2D动画 - 移动小车&quot;); // 注册回调函数 init(); glutDisplayFunc(renderScene); glutTimerFunc(0, update, 0); // 启动动画 // 进入主循环 glutMainLoop(); return 0; } 开启光照计算,加入至少2个光源,并设置2种以上材质,使得场景中的对象呈现出不同的材质特征。
06-13
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值