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

问题描述

我目前正在研究使用霍夫曼技术的无损压缩算法。 我设法压缩了所需的文件,并将压缩后的数据保存到文件中。 但是,我无法正确读取此文件中记录的内容。最好将这个文件内容存储在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:我能够测试this帖子中CilliéMalan提供的解决方案,但没有成功。我无法正确地从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');
}

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