I/O编程
2015-08-04 20:24
267 查看
今天先来做一个简单的面试题吧
以上程序的输出结果是什么呢?
答案是-128。
一个char类型数据占1个字节,即8位,能表示的数据范围是-128-127,而128的二进制为1000 00000,-128的二进制也是1000 0000,所以以整型输出的时候结果就为-128。
突然想到国际象棋的故事,第一个格子2^0,第二个格子2^1,……,最后一个格子2^63,一共应该是多少呢?我们可以把他缩小成只有8个格子,即2^0+2^1+...+2^7,这个比较容易理解,用二进制表示就是111 1111,加上以就等于1000 0000,即2^8,所以64个格子的总和应该是2^64-1,用二进制表示即为64个1。在计算机内部均用补码表示,因此我们可以这样做:
在32位系统下,unsigned long long占64位,全为1时即为-1。运行结果为18446744073709551615,天哪,这个数我是不知道到底有多大,怪不得国王要把发明国际象棋的人给杀了。
一、作业
1.计算默认缓冲区的大小
标准I/O提供了3种类型的缓存
全缓冲:当填满I/O缓冲后才进行I/O操作,例如磁盘操作;
行缓冲:当在输入或输出的时候遇到新的换行符(‘\n’)时,进行I/O操作,例如stdout、stdin;
不带缓冲:标准I/O库不对字符进行缓冲,例如strerr。
运行结果
这个程序一次写入4个字符进缓冲区,当i=256时,缓冲区装满,标准输出,i=257到300时,不能装满缓冲区,所以程序没有结束不会输出,由此我们可以计算出缓冲区的大小为256*4=1024。
2.编写复制文件的程序
如果要将一个文件拷贝到两个文件中,又该怎么做呢?,可以使用fseek()或rewind()定位到文件开始处再进行复制。
3.每隔一秒往文件写入当前的日期时间,其格式应为
1,2015-8-4 15:15:42
2,2015-8-4 15:15:43
第一个数据为序号,如果文件中已存在数据记录,应追加到源文件后,且序号应能连续上次的序号。
4.建立一个链表,将其写入文件中,然后从文件里读出来,逆序写入另一个文件
以上代码中链表的基本操作已完成,实现逆序保存,可以定义一个临时链表,将之前链表的数据一个一个从头插入,得到就是一个逆序的链表,再将该链表写入文件中即可。
#include <stdio.h> int main() { char c=128; printf("c=%d\n",c); return 0; }
以上程序的输出结果是什么呢?
答案是-128。
一个char类型数据占1个字节,即8位,能表示的数据范围是-128-127,而128的二进制为1000 00000,-128的二进制也是1000 0000,所以以整型输出的时候结果就为-128。
突然想到国际象棋的故事,第一个格子2^0,第二个格子2^1,……,最后一个格子2^63,一共应该是多少呢?我们可以把他缩小成只有8个格子,即2^0+2^1+...+2^7,这个比较容易理解,用二进制表示就是111 1111,加上以就等于1000 0000,即2^8,所以64个格子的总和应该是2^64-1,用二进制表示即为64个1。在计算机内部均用补码表示,因此我们可以这样做:
#include <stdio.h> int main() { unsigned long long d=-1; printf("d=%llu\n",d); return 0; }
在32位系统下,unsigned long long占64位,全为1时即为-1。运行结果为18446744073709551615,天哪,这个数我是不知道到底有多大,怪不得国王要把发明国际象棋的人给杀了。
一、作业
1.计算默认缓冲区的大小
标准I/O提供了3种类型的缓存
全缓冲:当填满I/O缓冲后才进行I/O操作,例如磁盘操作;
行缓冲:当在输入或输出的时候遇到新的换行符(‘\n’)时,进行I/O操作,例如stdout、stdin;
不带缓冲:标准I/O库不对字符进行缓冲,例如strerr。
#include<stdio.h> int main() { int i; for(i=1;i<300;i++) { if(i>=10&&i<100) printf("0%d ",i); //一次写4个字符到缓冲区 else if(i<10) printf("00%d ",i); else printf("%d ",i); } while(1); }
运行结果
这个程序一次写入4个字符进缓冲区,当i=256时,缓冲区装满,标准输出,i=257到300时,不能装满缓冲区,所以程序没有结束不会输出,由此我们可以计算出缓冲区的大小为256*4=1024。
2.编写复制文件的程序
#include<stdio.h> #include<sys/types.h> #include<sys/stat.h> #include<unistd.h> #include<fcntl.h> int main(int argc,char *argv[]) { FILE *fp1,*fp2; int ch; if((fp1=fopen(argv[1],"r"))==NULL) { perror("file1"); return -1; } if((fp2=fopen(argv[2],"wb"))==NULL) { perror("file2"); return -1; } while((ch=fgetc(fp1))!=EOF) fputc(ch,fp2); fprintf(stdout,"Copy file successfully!\n"); fclose(fp1); fclose(fp2); return 0; }
如果要将一个文件拷贝到两个文件中,又该怎么做呢?,可以使用fseek()或rewind()定位到文件开始处再进行复制。
3.每隔一秒往文件写入当前的日期时间,其格式应为
1,2015-8-4 15:15:42
2,2015-8-4 15:15:43
第一个数据为序号,如果文件中已存在数据记录,应追加到源文件后,且序号应能连续上次的序号。
#include<stdio.h> #include<time.h> #include <unistd.h> int main(int argc,char *argv[]) { static int n = 1; int ch; FILE *fp; time_t t; struct tm *tm; if(argc != 2) { fprintf(stdout,"Argument error"); return -1; } if((fp=fopen(argv[1],"a+")) == NULL) { perror("Openfile"); return -1; } rewind(fp); while((ch=fgetc(fp)) != EOF) { if(ch=='\n') n++; } while(1) { time(&t); tm = localtime(&t); fprintf(fp,"%d,%d-%d-%d %d:%d:%d\n",n,1900+tm->tm_year,1+tm->tm_mon,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec);//时间从1900年起,月份从0起,所以年+1900,月加1 fflush(fp); n++; sleep(1); } return 0; }
4.建立一个链表,将其写入文件中,然后从文件里读出来,逆序写入另一个文件
#include"list.h" #include<stdio.h> int main(int argc,char *argv[]) { if(argc != 3) fprintf(stdout,"Argument error!"); LIST *L = create_list(); LIST *L1 = create_list(); FILE *fp1,*fp2; int i = 100; if((fp1=fopen(argv[1],"a+"))==NULL) { perror("Open file1 fail!"); return -1; } if((fp2=fopen(argv[2],"a+"))==NULL) { perror("Open file2 fail!"); return -1; } while(i--) insert_list(L,i,HEAD); show_list(L); L=L->p; //有头链表,所以指向下一个节点 while(L->p) //遍历链表 { insert_list(L1,L->data,HEAD);//反序保存 fprintf(fp1,"%d ",L->data); //保存到文件 L = L->p; } insert_list(L1,L->data,HEAD); //保存最后一个元素 fprintf(fp1,"%d ",L->data); L1 = L1->p; while(L1->p) { fprintf(fp2,"%d ",L1->data); L1 = L1->p; } fprintf(fp2,"%d ",L1->data); fclose(fp1); fclose(fp2); return 0; }
以上代码中链表的基本操作已完成,实现逆序保存,可以定义一个临时链表,将之前链表的数据一个一个从头插入,得到就是一个逆序的链表,再将该链表写入文件中即可。
相关文章推荐
- [J2EE]java web项目中调用word转html命令行工具
- JAVA大数乘法 HDU1042
- kafka-python实现获得kafka topic
- python常见模块命令(os/sys/platform)
- 批处理 ftp 上传文件
- CodeForces 560C Gerald's Hexagon
- Struts2学习心得——传参
- Lua学习笔记(一):搭建开发环境
- java发送邮件(3)
- Ajax返回Json在Java中的实现
- C语言编程入门——综合练习(三)学生管理系统
- c语言 使用可变参数列表实现printf(my_printf)
- HDU 5351 MZL's Border(java 找规律)
- 我的C语言入门到精通之路 day06
- DRW入门之异常:java.lang.ClassNotFoundException: org.directwebremoting.servlet.DwrServlet.class
- 关于json反序列化字符串为java对象时科学计数法和精度问题
- Java大数加法 HDU1002 HDU1250
- Java Date,long,String 日期转换
- Ubuntu15.04中FTP-vsftp配置
- 使用Spring MVC 实现 国际化