Linux 库函数实现文件操作
1. Linux系统调用,文件的描述符使用的是一个整数,库函数访问文件使用FILE类型的指针去指向描述文件;
2. 库函数不随系统平台而变,即不管win还是Linux都适用;
库函数 - 读文件
size_t fread(void *ptr, size_t size, size_t n, FILE *stream)
功能:从stream指向的文件中读取n个字段,每个字段为size字节,并将读取的数据放入ptr所指向的字符数组中,返回实际已读取的字节数。(读出来的数据量为size*n)
库函数 - 写文件
size_t fwrite(const void *ptr, size_t size, size_t n, FILE *stream)
功能:从缓冲区ptr所指向的数组中把n个字段写到stream指向的文件中,每个字段长为size个字节,返回实际写入的字段数。
库函数 - 创建和打开
FILE *fopen(const char *filename, const char *mode)
filename:打开的文件名(包含路径,缺省为当前路径)
mode:打开模式
#include <stdio.h>
#include <stdlib.h>
int main()
{
FILE *fp;
char ch;
char fname[30];
printf("Please input the file name:");
scanf("%s", &fname);
fp=fopen(fname, "r"); //以只读方式打开
if(fp==NULL){ //打开失败
printf("Open failed.\n");
exit(1);
}
while((ch=getc(fp))!=EOF) //一个字符一个字符遍历
{
putchar(ch); //输出ch传入的字符
}
fclose(fp); //关闭文件
return 0;
}
读字符:
fgetc 获取字符:
fputc 输出字符:
#include <stdio.h>
#include <string.h>
int main()
{
char msg[] = "Hello, linuxdba";
// int i;
FILE *fp;
char ch;
fp = fopen("/etc/passwd", "r");
while ((ch = fgetc(fp)) != EOF)
//while (msg[i]&&(i < strlen(msg))) // ok,pass!
{
fputc(ch, stdout); //什么意思?
// i ++;
}
fclose(fp);
return 0;
}
路径获取
char *getcwd(char *buffer, size_t size)
功能:提供一个size大小的buffer,getcwd会把当前的路径名拷贝到buffer中。如果buffer太小,函数会返回-1.
库函数 - 创建目录
int mkdir(char *dir, int mode)
功能:创建一个新目录。返回0表示成功,返回-1表示出错。
// 拷贝一个文件到另外一个地方
#include <stdio.h>
int main()
{
FILE *fp = NULL; //定义文件指针,定义指针时需要将指针指向空。
FILE *fq = NULL;
char ch;
fq = fopen("/root/c_code/test/t.c", "a"); //“a”表示以附加的方式打开,如果文件不存在就创建文件
fp = fopen("/etc/passwd", "r") ; //打开文件
while ((ch = fgetc(fp)) != EOF) // fgetc和fputc拷贝
{
fputc(ch, fq);
}
fclose(fp); // 关闭文件
fclose(fq);
fp = NULL; // 将指针指向空,否则仍然指向原打开文件位置
fq = NULL;
return 0;
}
问题:如何实现文件名输入方式拷贝,即通用模式,当需要拷贝的时候,输入源文件名和目的文件名即可?
#include <stdio.h>
int main(int argc, char *argv[])
{
FILE *ffrom = NULL;
FILE *fto = NULL;
char ch;
if (argc < 3) // pop the error for less source or target file.
{
perror("Please input the source file and target file.\n");
}
ffrom = fopen(argv[1], "r") ;
fto = fopen(argv[2], "a");
while ((ch = fgetc(ffrom)) != EOF)
{
fputc(ch, fto);
}
fclose(ffrom); // close FILE pointer
fclose(fto);
ffrom = NULL; // point to NULL, otherwise it will still point to source file.
fto = NULL;
return 0;
}
格式化读fscanf: int fscanf(FILE *stream, char *format, [argument...])
#include <stdio.h>
int main(){
int i;
fscanf(stdin, "%d", &i); //格式化读
printf("the i is %d.\n", i);
}
注意:fscanf读以空格或者回车作为结束符,例如输入"2 5",此时只读取2
格式化写fprintf:int fprintf(FILE *stream, char *format, [argument...])
#include <stdio.h>
#define SOURCE_FILE "/root/c_code/test/t.c" //宏定义文件
int main(){
int a = 1;
char c = '\n';
char s[] = "this is a string.";
FILE *fp = NULL;
fp = fopen(SOURCE_FILE, "a"); //打开文件,并用文件指针指向它
fprintf(fp, "%s%c", s, c); //写入s字符串和c字符
fprintf(fp, "%d\n", a); //写入a数字
fclose(fp); //关闭文件指针
fp = NULL;
}
库函数定位fseek(系统调用为lseek)
int fseek(FILE *stream, long offset, int whence)
whence:
SEEK_SET:从文件的开始处开始搜索;
SEEK_CUR:从文件的当前位置开始搜索;
SEEK_END:从文件的结束处开始搜索
路径获取getcwd:
char *getcwd(char *buffer, size_t size)
功能:提供一个size大小的buffer,将当前的路径拷贝到buffer中,如果buffer太小函数返回-1.
#include <stdio.h>
#include <unistd.h>
int main(){
int fd;
char buffer[30];
getcwd(buffer,sizeof(buffer));
printf("The current path is: %s\n", buffer);
}
创建目录mkdir:
int mkdir(char *dir, int mode)
功能:创建一个新目录。
返回值:0表示成功,-1表示出错。
#include <stdio.h>
#include <sys/stat.h>
#define DIR "/root/test_dir"
int main(){
int fd;
if((mkdir(DIR, 0755)) == -1){
printf("mkdir fail.\n");
}
else{
printf("mkdir success.\n");
}
}