linux c语言对文件的操作

以下是c语言对文件的操作。

1、如何通过open生成一系列文件名连续的文件。比如file1.c 、file2.c 、file3.c。open的第一个传参为文件名,是字符串格式,我们需要将字符串(如file)与数字(1/2/3)连接起来。问题即转化为

2、如何把字符串与整数连接起来?

可以通过sprintf 函数。
原型:int sprintf( char *buffer, const char *format, [ argument] … );
参数列表:
buffer:char型指针,指向将要写入的字符串的缓冲区。
format:格式化字符串。可以通过插入 %d %g 一类的百分号标记 来插入数据。
[argument]...:可选参数,可以是任何类型的数据。
如:
char MyStr[256];
sprintf(MyStr, "Pi=%g. ", 3.1416);

众所周知open可以用来打开、创建文件,那么
3、c语言中如何删除文件?
remove()函数用于删除指定的文件
原型:int remove(char * filename);
如:
#include<stdio.h>
int main(){
    char filename[80];
    printf("The file to delete:");
    gets(filename);
    if( remove(filename) == 0 )
        printf("Removed %s.", filename);
    else
        perror("remove");
}
需要注意的是,gets()函数有潜在的危害,即当输入字符串的长度大于缓冲区长度时,并不会截断,原样输出读入的字符串,造成程序崩溃。可用fgets()代替。此部分参考 C语言remove()函数:删除文件或目录

4、获取文件信息:
想要获取某目录下(比如a目下)b文件的详细信息,我们应该怎样做?
首先,我们使用opendir函数打开目录a,返回指向目录a的DIR结构体dp。
接着,我们调用readdir( dp)函数读取目录a下所有文件(包括目录),返回指向目录a下所有文件的dirent结构体d。
然后,我们遍历d,调用stat(d->name,stat *e)来获取每个文件的详细信息,存储在stat结构体e中。

stat原型:int stat(const char *file_name, struct stat *buf);
说明:通过文件名filename获取文件信息,并保存在buf所指的结构体stat中
如:
stat("test.txt",&buf);
printf("1.link=%d\n",buf.st_nlink);//测试链接数
其中,stat结构体定义如下:
struct stat {
dev_t st_dev; //文件的设备编号
ino_t st_ino; //节点
mode_t st_mode; //文件的类型和存取的权限
nlink_t st_nlink; //连到该文件的硬连接数目,刚建立的文件值为1
uid_t st_uid; //用户ID
gid_t st_gid; //组ID
dev_t st_rdev; //(设备类型)若此文件为设备文件,则为其设备编号
off_t st_size; //文件字节数(文件大小)
unsigned long st_blksize; //块大小(文件系统的I/O 缓冲区大小)
unsigned long st_blocks; //块数
time_t st_atime; //最后一次访问时间
time_t st_mtime; //最后一次修改时间
time_t st_ctime; //最后一次改变时间(指属性)
};.

举例1:
#include <time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>

void main( void )
{
    struct stat buf;
    int result;
    //获得文件状态信息
    result =stat( "/home/", &buf );
    //显示文件状态信息
   if( result != 0 )
       perror( "显示文件状态信息出错" );//并提示出错的原因,如No such file or directory(无此文件或索引)
    else
    {
                printf("文件大小: %d", buf.st_size);
		printf("文件创建时间: %s", ctime(&buf.st_ctime));
		printf("访问日期: %s", ctime(&buf.st_atime));
		printf("最后修改日期: %s", ctime(&buf.st_mtime));
	}
}

举例2: Linux下 C语言实现遍历指定目录下指定格式的文件
        int size = strlen(dirp->d_name);  
        if(size<5)	//如果是.wav文件,长度至少是5  
            continue;  
        if(strcmp( ( dirp->d_name + (size - 4) ) , ".mp3") != 0)  //只存取.mp3扩展名的文件名  
            continue;     
        fputs(dirp->d_name,fp);  
        fputs(" ",fp);   // 在一个filename结束之后,写入空格,方便脚本读取,进程转换操作  



5、文件的软链接symbolic link和硬链接hard link
异:软链接是符号链接,相当于Windows中的快捷方式,是一个独立文件(拥有独立的inode,与源文件inode无关)
       硬链接是一个指针,指向源文件的inode,相当于将同一个文件注册为另外一个名字。系统并不为它重新分配新的inode。
同:两者的链接的文件都会同步产生变化。
用法: ln aa bb
            ln -s aa cc
给aa创建一个bb的硬链接和cc的软链接。可通过ls -l查看。

关于link和unlink、close等API详见 Linux中link,unlink,close,fclose函数详解
简而言之,link在创建硬链接的会创建文件,而unlink在删除硬链接的同时会删除文件。文件通过unlink删除后fd还在,需要close来关闭。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值