2015-12-25 8 views
0

Сначала я прочитал данные из файла двоичной матрицы и записал в новый файл, я использую другую программу для их чтения в память.При записи в двоичный файл fromstream :: write пишет больше байтов, чем должно было

часть записи

#define BIT_NUM 8 
using namespace std; 
int main(int argc, char **argv) { 
    if (argc >= 2) { 
     char* filename = argv[1]; 
     ifstream fin(filename); 
     ofstream fout("../../hashcode.dat", ios_base::trunc | ios_base::out | ios_base::binary); 
     char c; 
     bitset<BIT_NUM> temp; 
     int index = 0; 
     int count = 0; 
     while (fin.get(c)) { 
      if (c != '\n' && c != ',') { 
       temp.set(BIT_NUM - index - 1, c - '0'); 
       index++; 
      } 
      if (index == BIT_NUM) { 
       unsigned char byte = static_cast<unsigned char>(temp.to_ulong()); 
       fout.put(byte); 
       count++; 
       index = 0; 
      } 
     } 
     cout << count << "\n"; 
     fin.close(); 
     fout.close(); 
    } 
    return 0; 
} 

выход: 14610144

прочитать часть

#define BIT_NUM 256 
#define BYTE_NUM 32 
using namespace std; 
int main(int argc, char **argv) { 
    ifstream fin("../../hashcode.dat", ios_base::binary); 
    char buff[1]; 
    int count = 0; 
    while(fin) { 
     fin.read(buff, 1); 
     count++; 
     /**/ 
    } 
    cout << count << "\n"; 
    return 0; 
} 

выход: 14610145

Я стараюсь дифф результаты и обнаружил, что дополнительные байты в хвост и тот же, что и последний байт. Интересно, почему процесс ввода-вывода сделает дополнительный байт, подобный этому. Когда я просматриваю свойство hashcode.dat выходного файла, его размер равен 14610144 байтам.

ответ

1

Для чтения части:

#define BIT_NUM 256 
#define BYTE_NUM 32 
using namespace std; 
int main(int argc, char **argv) { 
    ifstream fin("../../hashcode.dat", ios_base::binary); 
    char buff[1]; 
    int count = 0; 
    while(fin.read(buff, 1)) { 
     count++; 
     /**/ 
    } 
    cout << count << "\n"; 
    return 0; 
} 
+0

Это решает проблему, спасибо вам большое. –

1

Это цикл чтения во второй части. Предположим, что файл пуст; в первый раз через fin все равно будет true, потому что вы открыли файл успешно, но еще не пытались его прочитать, и вы увеличивали бы count до 1, когда он должен оставаться на уровне 0.

Вам необходимо перестроить петлю, чтобы она только увеличивала счет после успешного чтения.

+0

Вы правы. Но как я могу изменить цикл чтения, чтобы исправить эту проблему? Спасибо. –

 Смежные вопросы

  • Нет связанных вопросов^_^