引言
練習(xí):完成cp的功能
步驟:
1.創(chuàng)建.c文件
2好爬、編輯.c文件
訪問文件
打開文件局雄,讀或者寫文件,關(guān)閉文件
保存并退出
3存炮、編譯 gcc或者makefile
4炬搭、驗(yàn)證是否成功
解決QT無法編譯代碼的問題:
yum install xterm
read/ write
//模擬cp命令
#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>
int main()
{
int fd;
int fdw;
ssize_t nread;
char buf[1024];
fd = open("/home/neusoft/demo.txt" , O_RDONLY);
fdw = open("/home/neusoft/demo.cpp" , O_WRONLY|O_CREAT| O_TRUNC ,0644 );
if(fd == -1) {
perror("error");
exit(1);
}
if(fdw == -1) {
perror("error");
exit(1);
}
while((nread = read(fd , buf, 1024))!=0){
write(fdw,buf,nread);
}
// if(nread == -1) exit(1);
close(fd);
close(fdw);
printf("***********");
// printf("%s",buf);
// printf("***********");
exit(0);
}
fgetc/fputc
#include <stdio.h>
#include <memory.h>
// ~adc.c adc.cpp
int main(void)
{
//打開文件
int n=0;
FILE *fr = fopen("/home/neusoft/adc.c","r");
if(NULL == fr){
perror("文件打開失敗");
exit(1);
}
FILE *fw = fopen("/home/neusoft/adc.cpp","w");
while((n=fgetc(fr))!=EOF){
fputc(n,fw);
}
fclose(fr);
fclose(fw);
printf("Hello World!\n");
return 0;
}
結(jié)論
庫函數(shù)和系統(tǒng)調(diào)用都可以實(shí)現(xiàn)的時(shí)候,優(yōu)先考慮庫函數(shù)(因?yàn)閹旌瘮?shù)有個(gè)緩輸出的過程)
練習(xí):
使用lseek
#include<unistd.h>
/* Standard file descriptors. */
#define STDIN_FILENO 0 /* 標(biāo)準(zhǔn)輸入. */
#define STDOUT_FILENO 1 /* 標(biāo)準(zhǔn)輸出. */
#define STDERR_FILENO 2 /* 標(biāo)準(zhǔn)錯(cuò)誤輸出. */
將制定的字符串寫入文件 a.txt
并讀出文件內(nèi)容到終端
#include <stdio.h>
#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>
#include <string.h>
int main(void)
{
int fd;
int fdw;
ssize_t nread;
char buf[] = "go go go go go go";
//fd = open("/home/neusoft/adc.c" , O_RDONLY);
fdw = open("/home/neusoft/a.cpp" , O_RDWR|O_CREAT| O_TRUNC ,0644 );
if(fdw == -1) {
perror("error");
exit(1);
}
write(fdw,buf,strlen(buf));
lseek(fdw,0,SEEK_SET);
while((nread = read(fdw , buf, 1024)))
{
// printf("%d\n",nread);
write(STDOUT_FILENO,buf,nread);
}
close(fdw);
exit(0);
}
結(jié)論:
文件的讀和寫使用的是同一個(gè)偏移量的位置穆桂,應(yīng)使用lseek宫盔。
#include <stdio.h>
#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
int main01(void)
{
int fd;
int fdw;
ssize_t nread;
char buf[] = "go go go go go go";
//fd = open("/home/neusoft/adc.c" , O_RDONLY);
fdw = open("/home/neusoft/a.cpp" , O_RDWR|O_CREAT| O_TRUNC ,0644 );
if(fdw == -1) {
perror("error");
exit(1);
}
write(fdw,buf,strlen(buf));
lseek(fdw,0,SEEK_SET);
while((nread = read(fdw , buf, 1024)))
{
// printf("%d\n",nread);
write(STDOUT_FILENO,buf,nread);
}
close(fdw);
exit(0);
}
//計(jì)算文件的大小 buf.st_size
//int stat(const char *path, struct stat *buf);
int main()
{
struct stat buf ;
int ret = 0;
ret = lstat ("/home/neusoft/sf02",&buf);
if(ret == -1)
{
perror("stat fail");
exit(1);
}
// printf("******");
// printf("%d\n",buf.st_size);
mode_t modes;
modes = buf.st_mode;
if (S_ISDIR(modes))
printf("S_ISDIR");
if (S_ISLNK(modes))
printf("S_ISLNK");
exit(0);
}
結(jié)論
stat與lstat使用文件名l查看文件狀態(tài)信息疆柔。
兩者基本一致损肛,但當(dāng)文件是一個(gè)符號(hào)連接時(shí)锨并,lstat返回符號(hào)連接本身信息泳姐,stat返回該連接指向的文件的信息渠啊。