У меня есть задача скопировать элементы из файла .txt [файл прямого доступа] в .bin файл [файл фиксированной длины записи] (домашняя работа). .txt файл содержит строки. Каждая строка имеет одно слово. Я придумал код ниже, но я не уверен, что это то, что нужно и даже немного правильное. Любая помощь будет полезна! (Я новичок в C++)C++ Из текстового файла в двоичный файл
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
const int buffer_size = 30;
class Word{
char name[buffer_size];
public:
void setName() // Trying to get every word from a line
{
string STRING;
ifstream infile;
infile.open ("text.txt");
while(!infile.eof()) // To get you all the lines.
{
getline(infile,STRING); // Saves the line in STRING.
}
infile.close();
}
};
void write_record()
{
ofstream outFile;
outFile.open("binFILE.bin", ios::binary | ios::app);
Word obj;
obj.setName();
outFile.write((char*)&obj, sizeof(obj));
outFile.close();
}
int main()
{
write_record();
return 0;
}
НОВЫЙ ПОДХОД:
class Word
{
char name[buffer_size];
public:
Word(string = "");
void setName (string);
string getName() const;
};
void readWriteToFile(){
// Read .txt file content and write into .bin file
string temp;
Word object;
ofstream outFile("out.dat", ios::binary);
fstream fin ("text.txt", ios::in);
getline(fin, temp);
while(fin)
{
object.setName(temp);
outFile.write(reinterpret_cast< const char* >(&object),sizeof(Word));
getline(fin, temp);
}
fin.close();
outFile.close();
}
int main()
{
readWriteToFile();
return 0;
}
Word::Word(string nameValue)
{
setName(nameValue);
}
void Word::setName(string nameString)
{
// Max 30 char copy
const char *nameValue = nameString.data();
int len = strlen(nameValue);
len = (len < 31 ? len : 30);
strncpy(name, nameValue, len);
name[len] = '\0';
}
string Word::getName() const
{
возвращение имя; }
Возможно, вам будет интересно прочитать ["Почему iostream :: eof внутри условия цикла считается неправильным?"] (Http://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop -условию рассмотренный-неправильно). –
Предложение: Если вам разрешено использовать 'std :: string' для этого назначения вместо этого:' char name [buffer_size]; 'сделайте это. Спасите вас от боли. Да. Много боли. – user4581301
@JoachimPileborg Спасибо за совет. Я все еще ищу ответ на мой вопрос! Дайте мне знать, если у вас есть идея :) – Maartin1996