2017-02-20 13 views
0

私は以下のような機能を持っています。この関数では、ファイル名がパラメータとして送信され、それが開かれ、その内容が読み込まれて利用されます。私が達成したいのは同じ機能ですが、文字列(ファイルの内容)をその関数に直接渡すことで実現します。だから私は、あなたがいずれかのChar *またはあなたの入力としてのstd ::文字列でそれを行うことができますC++:CライブラリファイルIOをC++ストリームIOに変換するにはどうすればよいですか?

unsigned CalcChecksum(char *filename, unsigned &found_checksum) 
{ 
    unsigned s, c, fcs; 
    char *ch; 
    char input[256]; 
    FILE *fp; 

    s = 0; 
    fp = fopen(filename, "rb"); 
    if (!fp) 
    { 
     found_checksum = 1; 
     return 0; 
    } 
    ch = fgets(input, 255, fp); 
    if ((feof(fp)) || (strncmp(input, "checksum", 8) == 0)) 
    { 
     fclose(fp); 
     return s; 
    } 
    while (1) 
    { 
     while (*ch != '\n') 
     { 
      c = (unsigned)*ch++; 
      s = CRCtab[(s^c) & 0xFF]^s >> 8; 
     } 
     ch = fgets(input, 255, fp); 
     if ((feof(fp)) || (strncmp(input, "checksum", 8) == 0)) 
      break; 
    } 
    if (strncmp(input, "checksum", 8) == 0) 
    { 
     fcs = 0; 
     sscanf(input, "checksum 0x%x", &fcs); 
     if (fcs == 0) 
      sscanf(input, "checksum 0X%X", &fcs); 
     found_checksum = fcs; 
    } 
    else 
     found_checksum = 0; 
    fclose(fp); 
    return s; 
} 
+0

これはプレーンなCコードのようです。とにかく[C-strings](https://www.programiz.com/c-programming/c-strings)について学ぶべきです。 – Melebius

+0

「これは以下のように」?それは機能なのか、そうではありませんか?そして、*正確に*何が問題なのですか?掲載されているように、これは実際の問題に関する質問よりも目標のようです。 CライブラリのファイルIOをC++ストリームIOに変換する方法を尋ねていますか?これは複数のステップからなるプロセスですが、最初はC++ IOストリームライブラリの理解と、できないことを理解することです。 – WhozCraig

+0

'CライブラリファイルIOをC++ストリームIOに変換する方法は?'はい、これは完全な方法です。私は関数全体を変換したくないのですが、Clib IOをC++ストリームIOに変換する方法を知っています。 –

答えて

0

feof、私はこれに近づくとfgetsのようなメソッドを変換する必要があります正確にどのように知りたいです。

unsigned CalcChecksum(char *fileContent, unsigned &found_checksum){ 
    int contentLength = strlen(filecContent); 
    while(contentLength > 0){ 
     ... 
     strncpy(input, fileContent, 255); 
     fileContent+=255; 
     contentLength-=255; 
     ... 
    } 
} 

またはスタンダード::文字列と

unsigned CalcChecksum(string fileContent, unsigned &found_checksum){ 
    int contentLength =filecContent.length(); 
    int pos = 0; 
    while(contentLength > 0){ 
     ... 
     input = fileContent.substr(pos, 255); 
     pos+=255; 
     contentLength-=255; 
     ... 
    } 
} 
0

オフトピックビットが、チェックサム機能を実現する1つの頻繁にエラーが中の1つのような(符号付き)から誤った変換charunsignedに、ありますあなたのコード:

c = (unsigned)*ch++; 

例:

#include <cstdio> 

unsigned checksum1(char const* data, size_t data_len) { 
    unsigned s = 0; 
    for(char const* end = data + data_len; data != end; ++data) 
     s += *data; // <--- incorrect conversion, same as s += (unsigned)*data. 
    return s; 
} 

unsigned checksum2(char const* data, size_t data_len) { 
    unsigned s = 0; 
    for(char const* end = data + data_len; data != end; ++data) 
     s += static_cast<unsigned char>(*data); // <--- correct conversion 
    return s; 
} 

int main() { 
    char const s[] = "© example.com"; 
    std::printf("%u %u\n", checksum1(s, sizeof s - 1), checksum2(s, sizeof s - 1)); 
} 

出力:

996 1508 

(暗黙)整数変換は、第1の幅を調整した後、符合を変更するためです。たとえば、char('©')int(-62)となり、次にunsigned(4294967234となります。署名の度合いを最初に変更する必要があります。char('©')unsigned char(168)となり、次にunsigned(168)となります。

0

CalcChecksumメソッドは、ストリングストリームをparamとして受け入れるようになりました。

unsigned CalcChecksumFromString(std::stringstream& stream, unsigned &found_checksum) 
{ 
    unsigned s, c, fcs; 
    char *ch; 
    s = 0; 

    if (!stream.rdbuf()->in_avail() == 0) 
    { 
     found_checksum = 1; 
     return 0; 
    } 

    std::string input; 
    std::getline(stream, input); 
    if ((stream.eof()) || (strncmp(input.c_str(), "checksum", 8) == 0)) 
    { 
     return s; 
    } 

    do 
     { 

     for (char& c : input) 
     { 
      c = static_cast<unsigned char>(c); 
      s = CRCtab[(s^c) & 0xFF]^s >> 8; 
     } 

     if ((stream.eof()) || (strncmp(input.c_str(), "checksum", 8) == 0)) 
      break; 
    } while (std::getline(stream, input)); 

    if (strncmp(input.c_str(), "checksum", 8) == 0) 
    { 
     fcs = 0; 
     sscanf(input.c_str(), "checksum 0x%x", &fcs); 
     if (fcs == 0) 
      sscanf(input.c_str(), "checksum 0X%X", &fcs); 
     found_checksum = fcs; 
    } 
    else 
     found_checksum = 0; 
    return s; 
} 
関連する問題