为什么ftell()告诉我参数无效?

问题描述 投票:0回答:1

在调试器中,我从 Executable.exe 中的 (ucrtbased.dll) 收到未处理的异常:将无效参数传递给认为无效参数致命的函数。

我相信我遵循了记录中的函数参数,所以我很困惑为什么会发生这种情况。

该代码来自我尝试使用 XOR 加密文本文件,如果这有助于提供任何清晰度。感谢您阅读本文!

#include <stdio.h>
#include <string.h>
#include <windows.h>
int WINAPI WinMain()
{

    FILE* ptr;
    ptr = fopen("C:\\Users\\User\\Desktop\\text.txt", "rb+");
    fseek(ptr, 0, SEEK_END);
    long endpoint = ftell(ptr);     //<<<<<<<<<<<<<<<<<<<<<< Area where Unhandled exception occurs
    char* buffer = malloc(endpoint + 1);
    endpoint = fread(buffer, 1, endpoint, ptr);
    rewind(ptr);
    char* temp = buffer;
    for (int i = 0; i < endpoint; i++, temp++)
    {
        *temp = *temp ^ 21;
    }
    fwrite(temp, 1, endpoint, ptr);
    free(buffer);
    fclose(ptr);
    return 0;
}
c
1个回答
0
投票

一般来说,您实际上应该检查可能失败的功能是否已经失败。

在您的情况下,

fopen
至少可能会因返回空文件句柄而失败,而
fseek
可能会因返回非零值而失败。

除了这两个问题之外,可能还存在其他问题,但在修复这两个问题之前您可能不会看到它们,因为程序似乎在它们之后立即崩溃。

您应该对其他代码遵循相同的策略,但这两个问题可以通过以下方式解决:

ptr = fopen("C:\\Users\\User\\Desktop\\text.txt", "rb+");
if (ptr == NULL) {
    fprintf(stderr, "Could not open file.\n");
    exit(1);
}

int rc = fseek(ptr, 0, SEEK_END);
if (rc != 0) {
    fprintf(stderr, "Could not seek to end of file.\n");
    exit(1);
}

© www.soinside.com 2019 - 2024. All rights reserved.