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
- c/c++小知识1 (文件)
- C语言小知识(1)
- C语言 小知识!~
- C 小知识整理
- c语言 小知识
- C/C++小知识
- c++/java小知识
- 求助 c小知识
- C语言小知识
- C/C++ 小知识
- c语言小知识
- C/C++小知识
- C语言小知识
- C语言小知识
- c小知识
- C语言小知识
- C语言小知识
- C语言小知识
- 感知机中的对偶形式理解
- 408专业复习
- (七)Spring Boot 整合Redis
- android.view.InflateException: Binary XML file line #12: Error inflating class...问题
- 模态窗口提交表单
- c/c++小知识1 (文件)
- VS2013/MFC编程基础——对话框的编程
- 机器学习(周志华)第四章习题解答
- Http协议与TCP协议简单理解
- SpringMVC使用ResponseEntity实现文件下载
- 数据持久层Hibernate 和MyBatis
- 记一次有意思的经历
- demo4,循环改变div颜色,总结
- linux mysql使用mysqldump备份定时执行shell脚本