168 lines
3.7 KiB
C++
168 lines
3.7 KiB
C++
#include "Tool_Functions.hpp"
|
||
|
||
extern "C"
|
||
{
|
||
#include "string.h"
|
||
#include "ctype.h"
|
||
}
|
||
|
||
// 行进到上一行起始位置
|
||
size_t f_seek_pre_line_begin(FILE *file)
|
||
{
|
||
int count = 0;
|
||
|
||
// 本身就在文件起始位置
|
||
if (ftell(file) == 0)
|
||
return 0;
|
||
// 本身在文件结尾
|
||
if (fgetc(file) == EOF)
|
||
{
|
||
// 移动到之前
|
||
do
|
||
{
|
||
fseek(file, -2, SEEK_CUR);
|
||
count--;
|
||
} while (ftell(file) != 0 && fgetc(file) != '\n');
|
||
|
||
return count;
|
||
}
|
||
|
||
// 其它情况
|
||
|
||
// 移动到上一行的结尾处(回到本行起始位置)
|
||
while (ftell(file) != 0 && fgetc(file) != '\n')
|
||
{
|
||
fseek(file, -2, SEEK_CUR);
|
||
count--;
|
||
}
|
||
|
||
// 移动到上上一行的结尾处
|
||
do
|
||
{
|
||
fseek(file, -2, SEEK_CUR);
|
||
count--;
|
||
} while (ftell(file) != 0 && fgetc(file) != '\n');
|
||
|
||
return count;
|
||
}
|
||
|
||
// 读取文件一行
|
||
size_t f_getline(FILE *file, char *buffer, const size_t buffer_len)
|
||
{
|
||
if (buffer == nullptr || file == nullptr)
|
||
return 0;
|
||
|
||
memset(buffer, '\0', buffer_len);
|
||
|
||
size_t count = 0;
|
||
|
||
// 循环读取
|
||
while (true)
|
||
{
|
||
// 超长判定
|
||
if (count + 1 == buffer_len)
|
||
return buffer_len;
|
||
|
||
// 正常读取
|
||
char ch = fgetc(file);
|
||
|
||
// 仅文件结尾时
|
||
if (ch == EOF && count == 0)
|
||
return 0;
|
||
|
||
// 成功换行
|
||
if (ch == '\n')
|
||
{
|
||
buffer[count] = '\n';
|
||
return count + 1;
|
||
}
|
||
|
||
// 没有换行但是遇到了文件结尾
|
||
if (ch == EOF)
|
||
{
|
||
buffer[count] = '\n';
|
||
return count;
|
||
}
|
||
|
||
// 其它情况下正常复制
|
||
buffer[count] = ch;
|
||
count++;
|
||
}
|
||
}
|
||
|
||
// 进度条打印
|
||
void progress_print(size_t completed, size_t total, bool reflush)
|
||
{
|
||
|
||
// 消除单行内容
|
||
if (reflush)
|
||
putchar('\r');
|
||
else
|
||
putchar('\n');
|
||
|
||
double p_percent = 1.0 * completed / total;
|
||
|
||
putchar('[');
|
||
|
||
// 输出完成部分填充
|
||
size_t completed_count = (PROGRESS_LENGTH * p_percent) - 1;
|
||
if (p_percent - (int)(p_percent) > 0.5)
|
||
completed_count++;
|
||
|
||
for (int count = completed_count; count > 0; count--)
|
||
putchar('=');
|
||
putchar('>');
|
||
|
||
// 填充未完成部分
|
||
for (int count = PROGRESS_LENGTH - (completed_count + 1); count > 0; count--)
|
||
putchar(' ');
|
||
putchar(']');
|
||
|
||
// 进度数显
|
||
printf(" %d/%d (%%%.2lf)", completed, total, p_percent * 100);
|
||
}
|
||
|
||
// 16进制字符串转有效无符号整数(8字节)
|
||
uint64_t hex_to_value(const char *str)
|
||
{
|
||
uint64_t value = 0;
|
||
|
||
int len = strlen(str);
|
||
// 循环读取
|
||
for (int count = 0; count < len; count++)
|
||
{
|
||
value *= 16;
|
||
if (str[count] >= '0' && str[count] <= '9')
|
||
value += str[count] - '0';
|
||
else
|
||
value += toupper(str[count]) - 'A' + 10;
|
||
}
|
||
return value;
|
||
}
|
||
|
||
// 判定字符串是否全部为有效数字
|
||
bool is_full_num(const char *str)
|
||
{
|
||
int len = strlen(str);
|
||
for (int count = 0; count < len; count++)
|
||
if (!isdigit(str[count]))
|
||
return false;
|
||
return true;
|
||
}
|
||
|
||
// 十进制字符串转有效无符号整数(8字节)
|
||
uint64_t str_to_value(const char *str)
|
||
{
|
||
uint64_t value = 0;
|
||
|
||
int len = strlen(str);
|
||
// 循环读取
|
||
for (int count = 0; count < len; count++)
|
||
{
|
||
value *= 10;
|
||
if (str[count] >= '0' && str[count] <= '9')
|
||
value += str[count] - '0';
|
||
}
|
||
return value;
|
||
}
|