0
//#include <QtCore/QCoreApplication>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <string>
#include "shift.h"

using namespace::std;

int main(int argc, char *argv[])
{
    unsigned char tmpBuf;
    FILE* fp;
    FILE* fp2;
    char fname[50];
    static unsigned int lSize, count, num;

    cout << "Input the filename:" << endl;
    cin >> fname;

    fp = fopen(fname,"r");
    if(fp == NULL) {
        cout << "The file does not exist!" << endl;
        exit(1);
    }

    // obtain file size:
    fseek(fp , 0 , SEEK_END);
    lSize = ftell(fp);
    rewind(fp);
    cout << "The intput file's size is: " << lSize << endl;

    fp2 = fopen("myfile", "w");

    while(1){
        num = fread(&tmpBuf, 1, 1, fp);
        count += num;
//        putchar(tmpBuf);
//        tmpBuf = cror(tmpBuf, 4);
//        tmpBuf = crol(tmpBuf, 4);
        fwrite(&tmpBuf, 1, num, fp2);

        cout << tmpBuf << " " << num << " " << count << endl;
        if (count == lSize){
            printf("over\n");
            break;
        }
    }

    fclose(fp);
    fclose(fp2);

    while(1){}

    return 0;

    //return a.exec();
}

我制作了一个 Qt 控制台程序并禁用了 QtCore,就像上面的代码一样。当读取某个文件时,例如 1.txt(仅包含 1234567890),它会成功。但是当读取其他文件时,例如 1.rar,它会失败,如下所示: 为什么? 在此处输入图像描述

4

1 回答 1

1

检查返回的 num 的值

num = fread(&tmpBuf, 1, 1, fp);

如果它返回为 0,那就可以解释为什么

if (count == lSize){

永远不会像真的那样让你摆脱困境。

至于为什么会发生这种情况,您正在以“r”模式打开 fname,但 rar 文件将是二进制文件。为此,我建议以“rb”模式打开。如果 fread 需要 txt 格式但达到 EOF 指示器,它将停止前进,因此 num = 0 并且 count 不会增加。

我没有可用的窗口来测试这个,但由于这个原因,stackoverflow 上出现了其他问题:

fread/ftell 在 Windows 下明显坏了,在 Linux 下工作正常

于 2013-02-03T04:25:29.860 回答