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 は増加しません。

これをテストするためのウィンドウはありませんが、この理由でスタックオーバーフローに他の質問が出てきました:

fread/ftell Windows では明らかに壊れているが、Linux では問題なく動作する

于 2013-02-03T04:25:29.860 に答える