Aco*_*orn 5 c++ pointers c++11
我试图围绕c头dirent.h编写一个现代的c ++包装器.
要读取C中目录的内容,请编写如下内容:
int listdir(const char *path) {
struct dirent *entry;
DIR *dp;
dp = opendir(path);
if (dp == NULL) {
perror("opendir");
return -1;
}
while((entry = readdir(dp)))
puts(entry->d_name);
closedir(dp);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
把它转换成现代c ++,我有以下内容(其中m_dir和m_dirent是std::unique_ptr,而m_files是a std::vector<string>)
filesystem::Directory::Directory(std::string dir) : m_dir(opendir(dir.c_str()), closedir),
m_dirent(new struct dirent())
{
//If the directory can not be read, throw an error.
if (!m_dir) {
sdl2::SDLFileSystemRead_Failure ex;
throw ex;
}
while (&(*m_dirent = *readdir(&*m_dir)))
{
m_files.emplace_back(std::string(m_dirent->d_name));
}
}
Run Code Online (Sandbox Code Playgroud)
这只有一半有效.当我写这篇文章时,我不知道我只是在检查表达式的地址是否*m_dirent = *readdir(&*m_dir)存在(当然,它确实存在!).根据单一UNIX®规范版本2,readdir(DIR*)如果已读取最后一个文件并且没有更多文件需要读取,则返回空指针.但是,我不确定如何在不调用的情况下将dirent指针设置为dir指针正在读取的.reset()内容m_dirent.这样做只会导致读取垃圾数据,因为我认为文件指针在dirent被销毁时会丢失.
我怎么能转换这个
while((entry = readdir(dp)))
puts(entry->d_name);
Run Code Online (Sandbox Code Playgroud)
进入现代C++?
逗号运算符来救援!
while(entry.reset(readdir(m_dir.get())), entry)
puts(entry->d_name);
Run Code Online (Sandbox Code Playgroud)
尽管,正如评论所说,这对于文件系统来说并不是一个出色的 API。例如,透明地适应底层目录的迭代器会很酷。
| 归档时间: |
|
| 查看次数: |
856 次 |
| 最近记录: |