#Linux中的GCC程式設計# 第一次作業
阿新 • • 發佈:2018-12-12
LSD 培訓作業
2017年8月17號
1、Demo1 帶參主函式,引數列印輸出
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
void delay(int time)
{
usleep(time*10000);
}
int main(int argc,char* argv[])
{
#if 1
if(argc<2)
{
printf("缺少\n");
return -1;
}
/*
if(argc!=2)
{
char* p="引數不夠";
fprintf(stderr,"%s\n",p);
//或者
perror("引數不夠\n");
return -1;
}
*/
int i=0;
while(argv[1][i])
{
printf("%c ",argv[1][i]);
fflush(stdout);
delay(10);
i++;
}
printf("\n");
#else
if(argc<2)
{
fprintf();
}
#endif
return 0;
}
/*
執行結果:
[email protected]:/usr/Kshine/lsd/0817$ ./D1 Kshine Love China !
K s h i n e
*/
2、帶參主函式,傳入檔名,寫入我喜歡的數字23,再讀出數值
//標準IO庫函式
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
//系統io
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
int main(int argc, char** argv)
{
if(argc<2)
{
printf("輸入出錯\t");
fprintf(stderr,"%s\n",strerror(errno));
return 0;
}
int fd = open(argv[1],O_RDWR | O_TRUNC |O_CREAT ,0664);
//-------------
int value=23;
if(write(fd,&value,sizeof(int))==-1)
{
printf("寫 出錯\t");
fprintf(stderr,"%s\n",strerror(errno));
return 0;
}
printf("write success!\n");
//------------
int value2=0;
//lseek(fd,-2,SEEK_CUR);
lseek(fd,0,SEEK_SET);
printf("offset success!\n");
if(read(fd,&value2,sizeof(int))==-1)
{
printf("讀錯誤\t");
fprintf(stderr,"%s\n",strerror(errno));
return 0;
}
printf("read success!\n");
printf("the value is : %d\n",value2);
close(fd);
return 0;
}
執行結果:
[email protected]:/usr/Kshine/lsd/0817$ ./D2 Kshine Love China
write success!
offset success!
read success!
the value is : 23
3、作業1:帶參主函式,傳入IP和PORT的等式,並進行分解輸出
/*
2017年08月17日
第一題:
IP = 192.168.1.1
PORT = 8080
要求通過 系統IO
分解出192.168.1.1存入 第一個字元陣列中,
分解出8080 存入第二個字元陣列中。
最後列印輸出。
*/
//標準庫
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
//系統庫
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
int main(int argc,char* argv[])
{
//程式執行命令,無後接的字串
if(argc>=2)
{
printf("執行命令錯誤\n");
//fprintf(stderr,"%s\n",strerror(errno));
return 0;
}
//使用者輸入
int i=0;
char str1[30]="";
char str2[30]="";
printf("請輸入字串1\n");//行快取,\n重新整理輸出
//scanf("%s%s",str1,str2);
gets(str1);
printf("請輸入字串2\n");
gets(str2);
//系統IO的操作----------------------------
//1、開啟檔案
//int open(const char *pathname, int flags, mode_t mode);
int fd = open("hw1",O_RDWR | O_CREAT | O_TRUNC,0664); //通過檔案符開啟
//許可權 S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH
printf("open success!\n");//行快取 通過\n 重新整理輸出
//2、寫入資料
if(write(fd,str1,sizeof(char)*30) == -1 || \
write(fd,str2,sizeof(char)*30) == -1 )
{
printf("寫出錯!\n");
fprintf(stderr,"%s\n",strerror(errno));
return 0;
}
printf("write success!\n");
//3、偏移檔案操作指標的位置
//lseek(fd,0,SEEK_SET);
FILE* fp =fdopen(fd,"r+");
//r+和w+都是讀寫,但是w+會清空已有檔案
fseek(fp,0,SEEK_SET);
//4、讀取資料
#if 1
i=0;
char ch=0;
int flag=0,count=0;//用於切換儲存的陣列
for(;;)
{
//讀取單個字元
if(read(fd,&ch,sizeof(char)) == 0 )
{
break;
}
if((ch <= '9'&& ch >= '0')|| ch== '.')//如果是數字或者.
{
if(ch == '.' && count>=0 )//記錄‘.’的個數
{
count++;
}
if(flag==0)//第一個字串儲存
{
str1[i]=ch;
i++;
continue;
}
if(flag >= 1)//1 第二個字元開始 2
{
flag=2;
str2[i]=ch;
i++;
continue;
}
continue;
}
//已經經過3個. 到這裡還不是數字
else if(count==3)
{
count=-10;//結束計數
str1[i]='\0';
flag=1;//切換到字串2
i=0;
}
if(flag==2)//已經在str2中寫了數字了,這裡不是數字,則埠的數值結束
{
str2[i]='\0';
break;
}
}
printf("read success!\n");
#endif
//5、關閉檔案
close(fd);
printf("close success!\n");
//6、輸出
printf("%s\n",str1);
printf("%s\n",str2);
return 0;
}
執行結果:
[email protected]:/usr/Kshine/lsd/0817$ ./H1
請輸入字串1
Kshine
請輸入字串2
Love
open success!
write success!
read success!
close success!
Kshine
Love
[email protected]:/usr/Kshine/lsd/0817$ ./H1
請輸入字串1
ip = 192.168.1.1
請輸入字串2
port = 8080
open success!
write success!
read success!
close success!
192.168.1.1
8080
4、帶參主函式,實現拷貝copy功能
/*
2017年08月17日
第二題
利用系統IO函式
實現 cp 功能,
要求檔名1,
檔名2
從main函式傳入。
*/
//標準庫
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
//系統庫
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
int main(int argc,char* argv[])
{
//程式執行命令
if(argc<3)
{
printf("執行引數不夠\n");
//fprintf(stderr,"%s\n",strerror(errno));
return 0;
}
//系統IO的操作---------------------------------------
//1、開啟檔案
//int open(const char *pathname, int flags, mode_t mode);
int fd1 = open(argv[1],O_RDONLY,0664);//檔案1,開啟 讀取
printf("open file1 success!\n");
int fd2 = open(argv[2],O_WRONLY | O_CREAT | O_TRUNC,0664); //通過檔案符開啟
//許可權 S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH
printf("open file2 success!\n");//行快取 通過\n 重新整理輸出
//2、單字元搬運
char ch=0;
while(1)
{
//讀取單個字元
if(read(fd1,&ch,sizeof(char)) == 0 )
{
break;
}
write(fd2,&ch,sizeof(char));
}
printf("copy complete!\n");
//3、關閉
close(fd1);
close(fd2);
return 0;
}
執行結果:
[email protected]:/usr/Kshine/lsd/0817$ gcc homework2.c -o H2 -Wall
[email protected]:/usr/Kshine/lsd/0817$ ./H2 text newText
open file1 success!
open file2 success!
copy complete!
5、帶參主函式,傳入檔名,將九九乘法表的列印輸出 重定向 到該檔案中。
/*
2017年08月17日
第三題
通過重定向FILE *freopen(const char *path, const char *mode, FILE *stream);
把99乘法表列印輸出到檔案,
輸出完成後復原重定向
在螢幕上列印write OK
*/
//標準IO庫函式
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
//系統io
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
int main(int argc ,char** argv)
{
if(argc!=2)
{
fprintf(stderr,"命令引數個數錯誤\n");
return 0;
}
//int creat(const char *pathname, mode_t mode);
//建立檔案
int fd=creat(argv[1],0664);
#if 1
//重定向
if(freopen(argv[1],"w",stdout)==NULL)
{
printf("重定向失敗\n");
return 0;
}
#endif
#if 0
/* 重定向 */
if (-1 == dup2(fd,STDOUT_FILENO) ) {
printf("can't redirect fd error\n");
exit(1);
}
#endif
//輸出
int i=1,j=1;
printf("九九乘法表:\n");
for(i=1;i<=9;i++)
{
for(j=1;j<=9;j++)
{
printf("%dx%d=%d\t",i,j,i*j);
}
printf("\n");
}
//還原重定向
#if 1
if(freopen("/dev/tty","w",stdout)==NULL)
{
printf("重定向失敗\n");
return 0;
}
#endif
#if 0
/* 恢復stdout */
if (-1 != dup2(fd,STDOUT_FILENO) ) {
printf("recover fd ok \n");
/* 恢復後,寫入stdout應該向螢幕輸出 */
write(STDOUT_FILENO,"stdout\n",7);
}
#endif
//再次輸出
printf("write ok \n");
//關閉
close(fd);
return 0;
}
[email protected]:/usr/Kshine/lsd/0817$ gcc homework3.c -o H3 -Wall
[email protected]:/usr/Kshine/lsd/0817$ ./H3 KKK3
write ok
[email protected]:/usr/Kshine/lsd/0817$ cat KKK3
九九乘法表:
1x1=1 1x2=2 1x3=3 1x4=4 1x5=5 1x6=6 1x7=7 1x8=8 1x9=9
2x1=2 2x2=4 2x3=6 2x4=8 2x5=10 2x6=12 2x7=14 2x8=16 2x9=18
3x1=3 3x2=6 3x3=9 3x4=12 3x5=15 3x6=18 3x7=21 3x8=24 3x9=27
4x1=4 4x2=8 4x3=12 4x4=16 4x5=20 4x6=24 4x7=28 4x8=32 4x9=36
5x1=5 5x2=10 5x3=15 5x4=20 5x5=25 5x6=30 5x7=35 5x8=40 5x9=45
6x1=6 6x2=12 6x3=18 6x4=24 6x5=30 6x6=36 6x7=42 6x8=48 6x9=54
7x1=7 7x2=14 7x3=21 7x4=28 7x5=35 7x6=42 7x7=49 7x8=56 7x9=63
8x1=8 8x2=16 8x3=24 8x4=32 8x5=40 8x6=48 8x7=56 8x8=64 8x9=72
9x1=9 9x2=18 9x3=27 9x4=36 9x5=45 9x6=54 9x7=63 9x8=72 9x9=81