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

来源:互联网 发布:sqlserver获取当前时间 编辑:程序博客网 时间:2024/05/21 10:56

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,失败返回-1int _rmdir( const char *dirname ); //成功返回0,失败返回-1
//调用system的md命令system("mkdir fPath");//fPath文件夹会被创建到当前工程目录下,若要在其他路径下,需要将具体路径写入,如D:\\path\\1,不能是D:/path/1system("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

原创粉丝点击