c/c++小知识1 (文件)

1、 c按行写入/读取
按行写:char指针字符末尾加入’\n’即可;不能加入’\r’,然后

FIlE *file = fopen(path,"a");//"a"代表不覆盖写
char *str = "xxx\n";
int offset = 1;
int len = strlen(str);
fwrite(str,len,offset,file);
fclose(file);
//'\n':向下移动一行,并移动左右
//'\r':return到当前行的最左边

按行写:

FILE *file = fopen(path,"r");
char buf[1024];
while(NULL != fgets(buf,1024,file)) {
    printf("len is %d,the line string is %s",strlen(buf),buf);
}
fclose(file);

2. 遍历文件夹下的所有文件

===示例代码===

#include<stdio.h>
#include <io.h>  //Linux和windows下都提供该头文件
int main() {
    char *folder = "C:/Users/admin/Desktop/in/*";//文件夹里面的文件可用通配符来代替
    _finddata_t filedir;
    long lfdir;
    if ((lfdir = _findfirst(folder, &filedir)) == -1) {
        printf("NO file");
    }
    else {
        do {
            printf("%s\n", filedir.name);
        } while (_findnext(lfdir, &filedir) == 0);
        _findclose(lfdir);
    }
}

===部分结构说明===
_finddata_t 结构
用来记录查找到的文件的信息,实际上有_finddata32_t,_finddata32i64_t,_finddata64i32_t,_finddata64_t,_wfinddata32_t,_wfinddata32i64_t,_wfinddata64i32_t,_wfinddata64_t八个结构,但都只是在32位/64位整数和字符类型上有所区别,但整体上相同。

struct _finddata_t {
    unsigned attrib;  //文件属性
    size_t time_create; //文件创建时间(UTC)
    size_t time_access; //文件最后一次被访问时间(UTC)
    size_t time_write; //文件最后一次被写入的时间(UTC)
    _fsize_t size; //文件的长度,以字节为单位
    char name[_MAX_PATH]; //文件或目录名,不包含路径
};
//对于不支持文件创建时间,上次访问时间的文件系统,时间赋值为-1

文件属性常量
文件属性常量
一个文件/目录可以有多种属性,每种属性可以是下面列出的属性之一。
_A_ARCH
档案。文件被BACKUP指令改变或清除时被设置。值:0x20。
_A_HIDDEN
隐藏。使用DIR指令一般看不到,除非使用/AH选项。值:0x02。
_A_NORMAL
普通。文件没有更多属性被设置,可以没有限制地被读或写。值:0x00。
_A_RDONLY
只读。不能以“写”为目的打开该文件,并且不能创建同名的文件。值:0x01。
_A_SUBDIR
子目录。值:0x10。
_A_SYSTEM
系统文件。使用DIR指令一般看不见,除非使用/A或/A:S选项。值:0x04。
要检查x是否含有某个属性a,可以用x & a进行检查。指定多个属性可以使用按位or运算符,例如_A_SYSTEM | _A_RDONLY | _A_HIDDEN

三个函数
_findfirst()

intptr_t _findfirst(  //intptr是int或int64的typedef
    const char * filespec,  //目标文件说明,可包含通配符
    struct _finddata_t *fileinfo  //函数和将会填入文件/目录信息
);
//失败 返回-1
//成功 返回一个唯一的搜索句柄标识

_findnext()

int _findnext(
    intptr_t handle, //搜索句柄
    struct _finddata_t *fileinfo //函数将会填入文件/目录信息
);
//成功 返回0
//失败 返回-1

_findclose()

int _findclose(
    intptr_t handle //搜索句柄
);
//关闭句柄病释放相应的资源
//成功 返回0
//失败 返回-1

参考http://www.cnblogs.com/collectionne/p/6815924.html

error
在新建一个工程里,同样的代码进行测试出现错误

这里写图片描述

检查发现,原版本是在win32下进行编译的,第二个测试是在x64环境下编译的,将第二个工程改为win32运行,代码就可以顺利运行啦。若想在x64的环境下运行,可将示例代码改为(这段代码在win32下也是可以运行的,具体的优劣没有进行过分析啦,个人认为若只需要满足32位的情况下,用64位去编译,内存的消耗肯定就相应的增大了,会造成一定的浪费的):

#include <stdio.h>
#include <io.h>
int main() {
    char *folder = "C:/Users/admin/Desktop/in/*";
    __finddata64_t filedir;
    __int64 lfdir; //句柄文件的类型也是要变化的
    if ((lfdir = _findfirst64(folder, &filedir)) == -1) {
        printf("NO file");
    }
    else {
        do {
            printf("%s\n", filedir.name);
        } while (_findnext64(lfdir, &filedir) == 0);
        _findclose(lfdir);
    }
}

参考:http://blog.csdn.net/u012925946/article/details/47830701

3.文件夹的创建和删除

创建的过程中是可以多层创建的,删除是删除指定的文件夹

//调用C运行库函数,dirname包含路径以及名字
#include <direct.h>
int _mkdir( const char *dirname ); //成功返回0,失败返回-1
int _rmdir( const char *dirname ); //成功返回0,失败返回-1
//调用system的md命令
system("mkdir fPath");//fPath文件夹会被创建到当前工程目录下,若要在其他路径下,需要将具体路径写入,如D:\\path\\1,不能是D:/path/1
system("rmdir fPath");
// C++ 调用Windows API
#include <Windows.h>
string path = "D:/Path";
bool flag = CreateDirectory(fPath.c_str(), NULL);//参数类型分别位:LPCSTR,LPSECURITY_ATTRIBUTES(不知道是啥)
flag = RemoveDirectory(fPath.c_str());
//两个都是成功true,失败false

在VS里调用Windows API进行文件夹创建,CreateDirectory()函数参数如果提示”Error: “const char”类型的实参与”LPCWSTR”类型的形参不兼容”,可利用下面的方法解决:
项目菜单——项目属性(最后一个)——配置属性——常规——项目默认值——字符集,将使用Unicode字符集改为未设置即可。

在创建文件或文件夹时,可以先利用access判断文件或文件夹是否存在或具有某些权限:

#include <io.h>
int _access(const char *filename, int mode);
//若存在或具有权限时,返回0;若不存在或不具有权限时返回-1;
/*mode代表
0 (F_OK) 只判断是否存在
2 (R_OK) 判断写入权限
4 (W_OK) 判断读取权限
6 (X_OK) 判断执行权限
*/

错误代码
EACCESS—参数pathname 所指定的文件不符合所要求测试的权限。
EROFS— 欲测试写入权限的文件存在于只读文件系统内。
EFAULT— 参数pathname指针超出可存取内存空间。
EINVAL— 参数mode 不正确。
ENAMETOOLONG— 参数pathname太长。
ENOTDIR— 参数pathname为一目录。
ENOMEM —核心内存不足
ELOOP— 参数pathname有过多符号连接问题。
EIO I/O— 存取错误。

参考:http://blog.csdn.net/xhhjin/article/details/6369336

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值