avatar

目录
优雅的写一个文件读取

用到的函数

fseek 函数原型:

c++
1
int fseek(FILE * stream, long offset, int whence);

SEEK_SET:文件开头
SEEK_CUR:文件当前位置
SEEK_END:文件末尾
该函数用于实现以任意顺序访问文件的不同位置

ftell:函数原型:

c++
1
long ftell(FILE *fp);

该函数用于得到文件位置指针当前位置相对于文件首的偏移字节数。

data():返回内置vecotr所指的数组内存的第一个元素的指针

c++
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 对象指定了一个输入流。

代码

c++
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

文章作者: Sunxin
文章链接: https://sunxin18.github.io/2021/05/14/read-file/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 lalala
打赏
  • 微信
    微信
  • 支付宝
    支付宝

评论