用到的函数
fseek 函数原型:
1
| int fseek(FILE * stream, long offset, int whence);
|
SEEK_SET:文件开头
SEEK_CUR:文件当前位置
SEEK_END:文件末尾
该函数用于实现以任意顺序访问文件的不同位置
ftell:函数原型:
该函数用于得到文件位置指针当前位置相对于文件首的偏移字节数。
data():返回内置vecotr所指的数组内存的第一个元素的指针
1
| size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream)
|
C 库函数 从给定流 stream 读取数据到 ptr 所指向的数组中。
ptr – 这是指向带有最小尺寸 size*nmemb 字节的内存块的指针。
size – 这是要读取的每个元素的大小,以字节为单位。
nmemb – 这是元素的个数,每个元素的大小为 size 字节。
stream – 这是指向 FILE 对象的指针,该 FILE 对象指定了一个输入流。
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| #include <iostream> #include <string.h> #include <stdio.h> #include <vector> #include <memory>
std::string read_file(const std::string &path) { FILE *file = fopen(path.c_str(), "r"); if (file == nullptr) { printf("Fail to open file '%s'", path.c_str()); return ""; } std::shared_ptr<FILE> fp(file, [](FILE *file) { fclose(file); }); fseek(fp.get(), 0, SEEK_END); std::vector<char> content(ftell(fp.get())); fseek(fp.get(), 0, SEEK_SET); int n = fread(content.data(), 1, content.size(), fp.get()); return n > 0 ? std::string(content.begin(), content.end()) : std::string(); }
int main(int argc, char *argv[]) { if (argc < 2) { std::cout << "[usage]:" << argv[0] << " output_path" << std::endl; return 0; } auto file_path = std::string(argv[1]) + "/test.txt"; std::string result = read_file(file_path); std::cout << result <<std::endl; return 0; }
|
参考内容:https://www.runoob.com/cprogramming/c-function-fread.html