无法读取C中的整个文件

时间:2019-12-07 01:08:04

标签: c

我正在尝试将内容从一个文件移动到另一个文件。
我的代码:

//@version=4
study(title = "Mercury Pivot", shorttitle="Mercury Pivot", overlay =true)

//These are the dates which i want the Triangle to be printed below 
t1 = timestamp(2017, 11, 1, 0, 0) // 1st of November 2017
t2 = timestamp(2018, 11, 1, 0, 0) // 1st of November 2018
t3 = timestamp(2019, 11, 1, 0, 0) // 1st of November 2019
plotshape(time == t1 or time == t2 or time == t3, style=shape.triangleup, location=location.belowbar, text="PIVOT", size=size.normal, transp=60)
// Alternate method.
tt1 = year == 2017 and month == 11 and dayofmonth == 1
tt2 = year == 2018 and month == 11 and dayofmonth == 1
tt3 = year == 2019 and month == 11 and dayofmonth == 1
plotshape(tt1 or tt2 or tt3, "tt", shape.triangleup, location.belowbar, color.fuchsia, text="PP", size=size.small, transp=0)

执行后将打印

    char *path = extractFileName(args[1]);
    if (path == 0)
        return -1;
    FILE *input = fopen(path, "r");

    rewind(input);
    fseek(input, 0L, SEEK_END);
    long sz = ftell(input);
    printf("sz: %ld\n", sz);
    rewind(input);

    size_t a;
    FILE *result = fopen("result.mp3", "w");
    size_t counter = 0;
    char buffer[128];
    while ((a = fread(&buffer[0], 1, 128, input)) != 0) {
        fwrite(&buffer[0], 1, a, result);
        counter += a;
    }

    printf("%d\n", counter);
    printf("ferror input: %d\n", ferror(input));
    printf("feof input: %d\n", feof(input));

据我所知,这意味着C知道输入文件的大小为665kb,但是当我尝试读取25662个字节以上时返回eof。我在做什么错了?

1 个答案:

答案 0 :(得分:7)

由于您的输出文件名是result.mp3,因此您可以安全地处理非文本数据。这意味着您应该以二进制模式打开文件-分别为"rb""wb"。如果您在Windows上运行此代码,则不执行该操作将解释您所看到的行为(在该平台上,以文本模式读取特定字节(0x1A)会导致该信号表明文件已结束,即使而不是结尾),并且使用二进制模式可以解决该问题。在其他OS上,这是无人操作的,但仍然可以使读者了解您的意图和期望使用的数据类型,因此即使不是严格要求它们也是一个好主意。