您的位置:首页 > 编程语言

I/O编程

2015-08-04 20:24 267 查看
         今天先来做一个简单的面试题吧

#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;
}


        以上代码中链表的基本操作已完成,实现逆序保存,可以定义一个临时链表,将之前链表的数据一个一个从头插入,得到就是一个逆序的链表,再将该链表写入文件中即可。

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: