将字符串写入文件不等于从中读取的字符串

时间:2014-01-08 15:43:21

标签: c++ file binary binaryfiles

第1阶段

示例1:我有string text = "01100001"然后我想写入文件"a"
示例2:我有string text = "0110000101100010"所以我想写入文件"ab"

NOTE:我解决了phase 1,写作的结果是真的。

第2阶段

例如1:

  
    

我想读取文件并将其放入temp     所以temp =“a”,我把它转换为“01100001”

  

例如2:

  
    

我想读取文件并将其放入temp     所以temp =“ab”并将其转换为“0110000101100010”

  

问题

在我的代码中,我有以下输入

    string text ="00000110101011100010001011111110011011110101100101110101101111010111111110101011"
"00111011000011100011100000100010111110111110111001100001110001110000101001111010"
"00000101";

我做了“第1阶段”,我在十六进制编辑器中打开文件,写作是真的 但在做了“第2阶段”temp!= text之后。为什么?

我的代码

#include <iostream>
#include <sstream>
#include <vector>
#include <fstream>
#include <string>
#include <stdlib.h>
using namespace std;

class bitChar{
public:
    unsigned char* c;
    int shift_count;
    string BITS;

    bitChar()
    {
        shift_count = 0;
        c = (unsigned char*)calloc(1, sizeof(char));
    }

    string readByBits(ifstream& inf)
    {
        string s ="";
        while (inf)
        {
            string strInput;
            getline(inf, strInput );

            for (int i =0 ; i < strInput.size() ; i++)
            {
                s += getBits(strInput[i]);
            }
        }
        return s;
    }

    void setBITS(string X)
    {
        BITS = X;
    }

    int insertBits(ofstream& outf)
    {
        int total = 0 ;
        while(BITS.length())
        {
            if(BITS[0] == '1')
                *c |= 1;
            *c <<= 1;
            ++shift_count;
            ++total;
            BITS.erase(0, 1);

            if(shift_count == 7 )
            {
                if(BITS.size()>0)
                {
                    if(BITS[0] == '1')
                        *c |= 1;
                    ++total;
                    BITS.erase(0, 1);
                }

                writeBits(outf);
                shift_count = 0;
                free(c);
                c = (unsigned char*)calloc(1, sizeof(char));
            }
        }

        if(shift_count > 0)
        {
            *c <<= (7 - shift_count);
            writeBits(outf);
            free(c);
            c = (unsigned char*)calloc(1, sizeof(char));
        }
        outf.close();
        return total;
    }

    string getBits(unsigned char X)
    {
        stringstream itoa;
        for(unsigned s = 7; s > 0 ; s--)
        {
            itoa << ((X >> s) & 1);
        }

        itoa << (X&1) ;
        return itoa.str();
    }

    void writeBits(ofstream& outf)
    {
        outf << *c;
    }

    ~bitChar()
    {
        if(c)
            free(c);
    }
};


int main()
{
    ofstream outf("ssSample.dat",ios::binary);

    string text ="00000110101011100010001011111110011011110101100101110101101111010111111110101011"
"00111011000011100011100000100010111110111110111001100001110001110000101001111010"
"00000101";
    cout<< text<<endl;

    //write to file
    bitChar bchar;
    bchar.setBITS(text);
    bchar.insertBits(outf);

    outf.close();

    ifstream inf("ssSample.dat" ,ios::binary);
    //READ FROM FILE
    string temp=bchar.readByBits(inf);

    cout << endl;
    cout << temp << endl;

    return 0;
}

3 个答案:

答案 0 :(得分:1)

您有一个LF换行符。这是被忽略的字符。

0000 1010

这可能不相关,但Windows需要CRLF表示新行。此代码在Windows与Unix中的行为可能不同。

一次读取一个字节。

string readByBits(ifstream& inf)
{
    string s ="";
    char buffer[1];
    while (inf.read (buffer, 1))
    {
       // string strInput;
        //getline(inf, strInput );

        //for (int i =0 ; i < strInput.size() ; i++)
        //{
            s += getBits(*buffer);
        //}
    }
    return s;
}

节目输出:

000001101010111000100010111111100110111101011001011101011011110101111111101010110011101100001110001110000010001011111011111011100110000111000111000010100111101000000101

000001101010111000100010111111100110111101011001011101011011110101111111101010110011101100001110001110000010001011111011111011100110000111000111000010100111101000000101

答案 1 :(得分:0)

您的方法的一个问题是您的文本必须是8位的倍数才能工作。否则,即使一切正确,也会从文件中读取最后一个字符并将其转换为字符串中的8个二进制数字,并添加尾随零。

答案 2 :(得分:0)

我很快发现了两个问题(但我认为还有更多)

  1. 您的输入不是 8位的倍数

  2. 通过使用getLine,您将阅读,直到遇到分隔字符,从而破坏您的结果,因为您没有处理基于文本的文件