我是C ++编程的新手,我正在尝试练习文件读写。我正在尝试获取当前目录的所有文件的大小。事情是,在获取当前目录中的文件名后,我将它们放在文本文件中。所以现在我被困住了,不知道从哪里去。
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
// FILE FUNCTION
void fileStuff(){
}
// MAIN FUNCTION
int main(int argc, char const *argv[])
{
// ERROR CHECKING
if(argc != 3){ // IF USER DOESN'T TYPE ./nameOfFile, AND THE OTHER REQUIRED ARGUMENTS.
cout << "Incorrect. Try Again" << endl;
exit(-1);
}
ifstream file;
string fileContents;
system("find . -type f > temp.txt");
file.open("temp.txt");
if (!file){
cout << "Unable to open file: temp.txt" << endl;
exit(-1);
}
while(file){
getline(file, fileContents);
cout << fileContents << endl;
}
file.close();
return 0;
}
答案 0 :(得分:2)
C++14(及早期版本,尤其是C++11)不了解file systems和directories(尚未)。对于C ++ 17,请参阅其file system library。否则,您的代码是特定于操作系统的,但Boost库有一些file system support。
我假设你在Linux或某些POSIX系统上运行。
您的程序只使用外部命令(find(1));如果您想从这样的命令中读取,可以将popen(3)与pclose
一起使用,那么您将不再需要临时文件。顺便说一句,您可以使用find . -type f -ls
。
但是,您不需要使用外部命令,避免这种情况更安全(也更快)。
迂腐地,文件名可以包含换行符,并且根据您的方法,您需要特殊情况。文件名也可以包含制表符(或其他控制字符),在这种情况下find . -type f
具体表现,您还需要特殊情况。在实践中,它的味道极差,并且文件名中不太可能有换行符或制表符,你可能会忘记这些奇怪的情况。功能
您可以使用nftw(3)。您可以递归使用opendir(3)&amp;循环readdir(3)(以及后来的closedir
)。
获得文件路径后,您使用stat(2)获取该文件的元数据,包括其大小(字段st_size
)。 BTW /bin/ls
和/usr/bin/find
程序使用它。
readdir(3)函数返回以struct dirent
结尾的d_name
指针;您可能希望跳过.
和..
的两个条目(因此请使用strcmp(3)与"."
和".."
进行比较,或者进行比较)。然后,您将使用字符串连接构建完整的文件路径。您可以使用(在真正的C ++中)std::string,或者可以使用snprintf(3)或asprintf(3)。如果您readdir
当前目录.
,则可以直接在d_name
字段上致电stat(2)。
BTW exit(-1)
不正确(当然味道不佳)。见exit(3)。更可读的替代方案是exit(EXIT_FAILURE)