C - 读取文件时无法读取所有字符

C - Cannot read all characters when reading a file

我目前正在研究使用霍夫曼技术的无损压缩算法。 我设法压缩了所需的文件,并将压缩后的数据保存到文件中。 但是,我无法正确读取此文件中记录的内容。最好,我想将此文件的内容存储在 std::string.

此文件的内容如下:

00000L,1LP10LURD100LVRj1LLRQRER.Rm1LlRr1LiRe1000LpRdRn100Lv100LC1LARF1LIRNRbRcRa100Lo100Lh1Lx1LMRSRf1LgRqRs1LuRt

X6*ÃWØ¿¸u÷üwµS™’ð‚<)âóUO_mÁ9Õö/ë‰ÍÌ Ï-,SÁúÚâuçëðÒì`WVwÿƒüšÎ뉊?Âgÿ­PÞuâ[CßTø¸CJŸy™“Þ¸Ý{+1sü <Ï~÷øà·\@¾¯à禡ú±Õö/Þüºû"í+ª•tÊæ+Ó¸Ð÷Õ>.'¦º¾Åü
úá‡
lÀ•¥¸Äq/?03òØ2'>÷?>9»ŸtY®Ùyù„‰u®'^~¿Û‚sŸ–öŽ(wß°/ì–~+K*•O´ ÿV:âyšö¨oãúü:ÿhrkã[‹7çjëĶ†KßW›˜iSêj£ÓúÆÉ×ûoÆÉï\l ÜKª‘Úɬ®b]T«ÏÖ42+4­Ô2µ“í«Ç7•’Ðä×Æ·Ø÷+ìÊþ¸˜¡sü!xSC—7ëoÿø=_bÿÔÕG§ÃIöÕÐÊV¥:ÅÅ?]Yß„ËsòÖx×™øÞíàæÍÓ+˜¯~7Æ´ 
puQäöÕA}ÿ².Õ {vÓ+˜¯¾ÍÌ ŽÞ¹úb+
 ç·ñd³óÿSUŸ
/ˆ®Œ|/õ}‹ñT`»áúüi|EuÄæçMSs’âóUOrßUSí
 ïFòH{Tû8ð¹C«ì_ׯ?_†—ÄWÅæªöV’ŽÜc`>ö0Á‹þÚ8¡ß~ÃH;ÜÙ¸dY¿;þ8-\`ÈœûÜüÞþSS™Zäî#d÷®7Bûo}åʪ¿ŽŽ(wß°Òö?õø0¡¿¾¯àÕ׉hñÇ7·™­Û‚rþ[ª%«KÅ’ý_býCxBí럿‡
löàœ„õÄææ÷îªÃÜ0ëðaxSˆ¬C´êÿm¨³]¯À¦W1^§T_XË®â6OF÷l4Ž;¦¿æ{÷»y—úØ«äý°sºâ³JÝB7ƶ…öñ«&ksóâóUOB    ‘9÷¹ùÅf•º†ë^¹,«Ì÷ïCIÏÖ0Áÿ¯Á¿žšç壂{é„Eë"í¡–VK{åSÈ-Êjs"+
*}œx_“Þ¸Þ[·[ŸjÃBµN[êª}¡}’ÏÖ4<…^+PÞ‡16kø¼Õ^‡&ÁÓO.UUülñªY/dÅÏð€þ7O·?X×.„4Ÿm]2¹Š÷’œO©ªOúš¨ôøiSìãÂülžõÆòؽºÜûPÞªrßUSí?Õ~lÜ­@_ÿ­%›ŠÃIÏÖ,ïèÁwÂü4©¯ö¨oéZÁœSøªÿA¸—XõÂòO$Ìþ¸Äq>Ú¹¿[ÞY¬‹µòÑÄrÄÙ¯r†…öáæl ™Ÿ{Ÿ›&²¹Œº‹þÙÄíæ_ëBõb}çÃb8"ZW^Òº©Vɬ®bp¨±í¿Ê¥Sí³¯pȳ~vÎü ï–çç\LP¹þÛBûpÆó7\LP¹þ‚<)dÖW1d¾ë싶‹5Ûo3

这是我为读取其内容而编写的代码:

int main(){     
    int number_of_lines = 0;
    std::string line;
    
    std::ifstream myfile("my_file.txt.huff");
    while (std::getline(myfile, line)){
        ++number_of_lines;;
        std::cout << "line number: " << number_of_lines << " content: " << line << std::endl;
    }
}

我也试过这种方式:

int main(){     
    FILE *find = fopen("my_file.txt.huff", "r");
    int ca;
    while(EOF != (ca=fgetc(find)))
          std::cout << (char)ca;
    std::cout << std::endl;
}

这是给出的第一个代码的控制台渲染:

line number : 1 content : 00000L,1LP10LURD100LVRj1LLRQRER.Rm1LlRr1LiRe1000LpRdRn100Lv100LC1LARF1LIRNRbRcRa100Lo100Lh1Lx1LMRSRf1LgRqRs1LuRt
line number : 2 content :
line number : 3 content : X6*├WÏ┐©Øu¸³wÁSÖÆ­é<)Ô¾UO_m┴9ı÷/Ùë═╠ ¤-,S┴·┌ÔuþÙ­Êý`WVw â³

每次我尝试读取此文件时,问题都会重复出现。确实,我使用的方法不允许我完整地阅读它。

为什么会出现这个问题?

提前谢谢你

N.B:我能够测试 Cillié Malan 在 post 中提供的解决方案,但没有成功。我在从 std::wstringstream 正确转换为 std::string 时遇到问题。

这是一个以二进制模式打开文件并将整个文件读入 std::vector<uint8_t> 的简短示例。 (如果愿意,您也可以使用 std::array<uint8_t>)。您打开文件,.seekg() 到最后,获取字节数并使用该字节数创建向量,然后 .read() 将文件放入向量中。

下面以文件名作为第一个参数,以十六进制格式输出内容(对于大文件,测试前更改输出以限制转储的内容stdout

#include <iostream>
#include <fstream>
#include <vector>

int main (int argc, char **argv) {

    if (argc < 2) { /* validate filename given as argument */
        std::cerr << "error: insufficient arguments\n"
                    "usage: " << argv[0] << " filename.bin\n";
        return 1;
    }
    /* open file in binary mode, position at-the-end */
    std::ifstream f (argv[1], std::ios::binary | std::ios::ate);

    if (!f.is_open())                           /* validate file open for reading */
        return 1;
    
    size_t nbytes = f.tellg();                  /* get number of bytes in file */
    f.seekg (0);                                /* rewind */
    
    std::vector<uint8_t> arr(nbytes);           /* declare vector with adequate storage */

    f.read(reinterpret_cast<char*>(&arr[0]), nbytes);   /* read file into vector */ 
    
    if (f.bad() || f.fail())                    /* validate read */
        return 1;

    for (auto& i : arr) /* output results (limit for larger files) */
        std::cout << std::hex << std::showbase << static_cast<uint32_t>(i) << " ";
    std::cout.put ('\n');
}

检查一下,如果您还有其他问题,请告诉我。有几种方法可以解决这个问题。