有一个文件夹,其中有大量不同名称的.txt文件,名称的第一部分包含日期,第二部分可以认为是随机的。如何在不知道文件确切名称的情况下按顺序打开一个文件进行读取,直到文件夹末尾?也许您可以从 Windows 获取有关该文件类型的信息,并以某种方式获取其名称并将其传输到程序?
Timon55
Asked:
2022-07-23 14:55:09 +0800 CST
我正在尝试从这里执行任务 1 ,编码、解码和生成算法是从那里获取的。我无法弄清楚 encode_variant 是如何工作的。为什么它返回 size_t ?好吧,我试着戳一下输入,我给了数字 122,比如说,返回 1,我给 222,返回 2。不知何故,它看起来不太像一个编码数字。下一个问题是如何使用解码从这个编码的数字中获取原始数字。我不明白数字 2 应该以什么形式传输,例如,为了将其解码回 222。任务是生成两个具有 100000000 个随机数的文件,一个应该包含没有编码的数字,另一个用它你需要比较文件大小,我得到相同大小的文件 3907 KB,从逻辑上讲,编码后,这些数字应该占用更小的体积。这是代码
#include <assert.h>
#include <stddef.h>
#include <stdint.h>
#include <stdlib.h>
#include <stdio.h>
#define ERROR_FILE_OPEN -3
size_t encode_varint(uint32_t value, uint8_t* buf)
{
assert(buf != NULL);
uint8_t* cur = buf;
while (value >= 0x80) {
const uint8_t byte = (value & 0x7f) | 0x80;
*cur = byte;
value >>= 7;
++cur;
}
*cur = value;
++cur;
return cur - buf;
}
uint32_t decode_varint(const uint8_t** bufp)
{
const uint8_t* cur = *bufp;
uint8_t byte = *cur++;
uint32_t value = byte & 0x7f;
size_t shift = 7;
while (byte >= 0x80) {
byte = *cur++;
value += (byte & 0x7f) << shift;
shift += 7;
}
*bufp = cur;
return value;
}
/*
* Диапазон Вероятность
* -------------------- -----------
* [0; 128) 90%
* [128; 16384) 5%
* [16384; 2097152) 4%
* [2097152; 268435455) 1%
*/
uint32_t generate_number()
{
const int r = rand();
const int p = r % 100;
if (p < 90) {
return r % 128;
}
if (p < 95) {
return r % 16384;
}
if (p < 99) {
return r % 2097152;
}
return r % 268435455;
}
int main(void){
uint8_t* mybuffer;
mybuffer = malloc(sizeof(uint8_t));
FILE *output1 = NULL;
FILE *output2 = NULL;
output1 = fopen("C:/Users/forjo/Documents/C Prog/Programms/bitwise/compressed.dat","wb");
if (output1 == NULL) {
printf("Error opening file");
getch();
exit(ERROR_FILE_OPEN);
}
output2 = fopen("C:/Users/forjo/Documents/C Prog/Programms/bitwise/uncompressed.dat","wb");
if (output1 == NULL) {
printf("Error opening file");
getch();
exit(ERROR_FILE_OPEN);
}
size_t count = 1;
for (int i=0; i<1000000; i++){
uint32_t random = generate_number();
uint32_t compress = encode_varint(random,mybuffer);
fwrite(&compress, sizeof(compress), count, output1);
fwrite(&random, sizeof(random), count, output2);
}
return 0;
}