Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.118.137.243] |
|
Сообщ.
#1
,
|
|
|
Здравствуйте,
заполняется вектор1 с массивом структур, сохраняю в файл, начинаю считывать в вектор2 - выдаёт количество элементов плюс один. Кто-нибудь может объяснить, что не так, вот код: #include "stdafx.h" #include <fstream> #include <iostream> #include <vector> using namespace std; struct MyStruct { char* city; int number; }; int _tmain(int argc, _TCHAR* argv[]) { vector <MyStruct> vector1, vector2; MyStruct struct1, struct2; int i = 0; for (i = 0; i < 10; i++) { struct1.city = "City"; struct1.number = i+1000; vector1.insert(vector1.end(), struct1); } FILE *file; file = fopen("cpp2.dat","wb"); for (i = 0; i < vector1.size(); i++) fwrite(&vector1[i], sizeof(vector1[i]), 1, file); fclose(file); i = 0; file = fopen("cpp2.dat","rb"); while(!feof(file)) { fread(&struct2, sizeof(struct2), 1, file); vector2.insert(vector2.end(), struct2); } fclose(file); for (i = 0; i < vector2.size(); i++) cout << vector2[i].city << " " << vector2[i].number << endl; system("pause"); return 0; } |
Сообщ.
#2
,
|
|
|
Цитата Rustam @ Кто-нибудь может объяснить, что не так, вот код: Проверь, что у тебя возвращает fread: size_t n = fread(.......); |
Сообщ.
#3
,
|
|
|
Потому что feof() выдаёт состояние потока, а не анализирует позицию в файле. Состояние встанет в EOF не после чтения последней структуры, а при попытке чтения за ней.
P.S. В программе две грубых ошибки: |
Сообщ.
#4
,
|
|
|
добавил size_t, теперь нормально выводит количество
for (i = 0; i < t; i++) { size_t n = fread(&struct2, sizeof(struct2), 1, file); if (n==1) vector2.insert(vector2.end(), struct2); } Добавлено Цитата Qraizer @ Потому что feof() выдаёт состояние потока, а не анализирует позицию в файле. Состояние встанет в EOF не после чтения последней структуры, а при попытке чтения за ней. P.S. В программе две грубых ошибки: А почему грубые ошибки, если всё работает как надо? |
Сообщ.
#5
,
|
|
|
Мдя кто тя учил так программировать? Не бабушка нет?
Добавлено Что это?! struct1.city = "City"; Надо strcpy(struct1.city, "City"); Да естесно предварительно там память выделиьь для city |
Сообщ.
#6
,
|
|
|
Цитата Rustam @ А почему грубые ошибки, если всё работает как надо? |
Сообщ.
#7
,
|
|
|
Цитата Qraizer @ Насчёт char* понятно, а как я могу записать вектор в файл, это же объект, он у меня только как указатель записывается как строку вектор можно записать с какими нибудь разделителями с помощью ofstream и считать ifstream ? |
Сообщ.
#8
,
|
|
|
Цитата Rustam @ Насчёт char* понятно, а как я могу записать вектор в файл, это же объект, он у меня только как указатель записывается Объяви структуру как struct MyStruct { char city[64]; int number; }; ....... for (i = 0; i < 10; i++) { strcpy(struct1.city, "City"); struct1.number = i+1000; vector1.insert(vector1.end(), struct1); } |
Сообщ.
#9
,
|
|
|
как-то так получилось,
теперь и читает и записывает в разных программах такой код пойдёт ? vector <MyStruct> vector1, vector2; MyStruct struct1, struct2; int i = 0; for (i = 0; i < 10; i++) { strcpy(struct1.city,"City"); struct1.number = i+1000; struct1.fl = i + 10; vector1.insert(vector1.end(), struct1); } // запись ofstream fout("cpp2.txt"); int t = vector1.size(); for (i = 0; i < t; i++) fout << vector1[i].city << "|" << vector1[i].number << "|" << vector1[i].fl << endl; fout.close(); // чтение ifstream fin("cpp2.txt"); i = 0; string line; while (fin) { getline(fin, line, '|'); if (line.size() == 0) break; const char *ptr = line.c_str(); strcpy(struct2.city, ptr); getline(fin, line, '|'); struct2.number = stoi(line); getline(fin, line); struct2.fl = stof(line); vector2.insert(vector2.end(), struct2); } fin.close(); for (i = 0; i < vector2.size(); i++) cout << vector2[i].city << " " << vector2[i].number << " " << vector2[i].fl << endl; |
Сообщ.
#10
,
|
|
|
Цитата Rustam @ такой код пойдёт ? А MyStruct как объявлена? |
Сообщ.
#11
,
|
|
|
Цитата Олег М @ struct MyStruct { char city[30]; int number; float fl; }; |
Сообщ.
#12
,
|
|
|
Искал, искал и, наконец, нашёл, что город Бад-Мюнстер-на-Штайн-Эбернбурге не влезет в массив.
|
Сообщ.
#13
,
|
|
|
Цитата Славян @ Искал, искал и, наконец, нашёл, что город Бад-Мюнстер-на-Штайн-Эбернбурге не влезет в массив. Мог бы не искать, а просто сказать, что лучше здесь использовать функцию strncpy static const size_t _city_ln = 30; struct MyStruct { char city[_city_ln + 1]; int number; float fl; }; ........ MyStruct struct1 = {0}; ..... strncpy(struct1.city, "City", _city_ln); |
Сообщ.
#14
,
|
|
|
Всем спасибо!
|