在 C 语言中,写入 ~2gb 以上的文件不会停止

Writing doesn't stop for files above ~2gb in C

提问人:Nicholas Picklas 提问时间:6/22/2023 更新时间:6/22/2023 访问量:63

问:

我有一些 C 代码,应该生成密码并将其保存到文件中。我试图输入一个大约 10 GB 的长度(大得离谱,但我想看看它能以多快的速度做到这一点),它并没有停留在 10 GB。

#define _FILE_OFFSET_BITS 64
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
int main(){
    int i = 0;
    char chars[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890_-+={[]}\\|;:'\",<.>/?`~!@#$^&*()";
    long long size;
    char keypath[512];
    char password;
    printf("Where should the key be saved? ");
    fgets(keypath, sizeof(keypath), stdin);
    keypath[strcspn(keypath, "\n")] = 0;
    printf("How long should the key be? ");
    scanf("%lli",&size);
    getchar();
    srand((unsigned int)(time(NULL)));
    FILE* fptr = fopen(keypath,"a");
    if (fptr == NULL) {
        printf("Failed to open file for writing\n");
        return 1;
    }
    for (i = 0; i < size; i++){
        int choice = rand() % strlen(chars);
        password = chars[choice];
        fprintf(fptr, "%c", chars[choice]);
    }
    fclose(fptr); 
    return 0;
}

似乎当它超过 1 gib 时(我假设是 2 gib,因为这是使用前的常规数量),它不会停止写入,而是看似无限期地继续。#define _FILE_OFFSET_BITS 64

我正在使用 Raspbian。

非常感谢任何帮助。

C 文件 IO

评论

1赞 stark 6/22/2023
如果 int i 是 32 位,则它始终< 10G
1赞 Weather Vane 6/22/2023
循环控制是 。它会在你的“~ 2gb”周围溢出。int
0赞 Eric J. 6/22/2023
切言,rand() 不适合密码学。random.org/randomness
0赞 chux - Reinstate Monica 6/22/2023
@Nicholas Picklas,节省时间。启用所有编译器警告。 --> .int i = 0;long long i = 0;
0赞 Weather Vane 6/22/2023
题外话:为什么要在“追加”模式下打开文件?

答:

4赞 Andreas Wenzel 6/22/2023 #1

最好将变量设置为 类型 ,这样可以保证它能够表示 10 GB 的文件大小。sizelong long

但是,您忘记对变量 .相反,您给出了数据类型 。iiint

因此,循环

for (i = 0; i < size; i++){
    int choice = rand() % strlen(chars);
    password = chars[choice];
    fprintf(fptr, "%c", chars[choice]);
}

由于有符号整数溢出,将调用未定义的行为,除非您碰巧位于能够表示文件大小为 10 GB 的平台上。在大多数常见的 PC 平台上,INT_MAX(可以表示的最大值)的值为 。在这些平台上,an 无法表示值 。intint2147483647int10000000000