2016-01-30 3 views
1

Я посылаю массив из 5 строк в функцию, которая будет записывать их в двоичный файл. Моя проблема в том, как я могу это сделать? Как проверить размер массива, если я отправляю его указателем? Я включил #include <string> и using namespace std;.Как написать массив строк в двоичный файл?

void my_func(string *array, int n) 
{ 
ofstream my_file("file.bin", ios_base::binary); 
if (!my_file) 
{ 
    cout << "error" << endl; 
    return; 
} 
my_file.write((char*)array, n*sizeof(string)); 
my_file.close(); 
} 

void fun1() 
{ 
string array[5]; 
for (int i = 0; i < 5; i++) 
{ 
    cout << "enter word " << i + 1 << ": "; 
    getline(cin, array[i]); 
} 
my_func(array,5); 
return; 
} 

Так что это работает, но я использую слишком много байтов для ничего, я хочу взять правильное количество байтов. Или, если есть простой способ сделать все это, я буду благодарен. И, пожалуйста, дайте мне школьный пример, я студент.

Выход:

+1

Как определен 'string'? –

+0

@LogicStuff я опубликую изображение – Kira

+0

Вы пишете саму реализацию 'std :: string' в файл вместо его содержимого. – Lingxi

ответ

2

Я перезаписать свой ответ, потому что первая версия была написана с некоторым непониманием

Вы можете просто сделать это таким путем.

void my_func(string *str_array, int n) 
{ 
    ofstream my_file("file.bin", ios_base::binary); 
    if (!my_file.is_open()) { 
     cout << "error" << endl; 
     return; 
    } 
    for (int i = 0; i < n; i++) { 
     // If strings are null-terminated use +1 to separate them in file 
     my_file.write(&str_array[i][0], str_array[i].length() + 1); 
     // If strings aren't null-terminated write a null symbol after string 
     // my_file.write("\0", 1); 
    } 
    my_file.close(); 
} 

Это одна из распространенных ошибок начинающих - sizeof(pointer type) ожидал, что он возвращает размер массива, но размер указателя будет возвращен.

+0

Учитывая, что целью написания файла обычно является то, что его можно впоследствии прочитать, это проблематично. Для чтения читатель не может получить информацию о длине. Если единственная строка не является ALL, которая записывается в файл. – Peter

+0

@Peter, это может быть строка с нулевым завершением. – ComradeAndrew

+0

@ComradeAndrew, но я хочу написать массив строк, а не одну строку – Kira

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