Я беру данные из одного файла и записываю в другой:
void OutputFile(array* arr, int &n) {
ofstream fout("test.txt");
for (int i = 0; i < n; i++) {
fout << arr[i].Name << endl;
fout << arr[i].Cost << endl;
fout << arr[i].Min << endl;
fout << arr[i].Max << endl;
}
fout.close();
}
void InputFile(array* arr,int &n,bool &flag) {
char string[20];
cout << "Input the name of the file:" << endl;
cin >> string;
strcat(string, ".txt");
char *str = new char[1024];
int i = 0;
ifstream fin(string);
while (!fin.eof())
{
fin.getline(str, 1024, '\n');
i++;
}
delete str;
fin.close();
n = i/4;
arr = new array[n];
ifstream fin1(string, ios::binary);
for (int i = 0; i < n; i++) {
fin1 >> arr[i].Name;
fin1 >> arr[i].Cost;
fin1 >> arr[i].Min;
fin1 >> arr[i].Max;
}
fin1.close();
}
void main() {
int n = 0;
array* arr= new array[n];
bool flag = false;
InputFile(arr,n, flag);
Output(arr, n);
}
Но вместо данных, в файле отображаются иероглифы. Как это исправить? array - структура данных
struct array {
char Name[20];
double Cost;
short int Min, Max;
};
В файле содержится следующий текст:
one
400
2
5
two
375
2
5
three
399
2
5
А выводится в файл следующее:
ээээЭЭЭЭЭЭЭЭЭЭЭЭсП™NЋ
8.45831e-305
27592
29261
9.42845e-310
-12303
20121
ЂІН
-7.84591e+298
-12851
-12851
Windows 10,x64, VS 2015 Pro
У вас в функции InputFile
выделяется свой собственный массив для чтения данных. Вот в него вы и читаете данные. В функцию main
вы этот массив никак не возвращаете - он просто тихо "забывается" (становится утечкой памяти по выходу из InputFile
).
Массив, который вы создали ранее в main
(размера 0?) ничего об этом не знает и никакого отношения к читаемому из файла массиву не имеет. Он никак ни для чего не используется и никакие данные в него не попадают.
Потом вы пытаетесь посылать на выход в функцию OutputFile
именно массив нулевого размера из main
. Неудивительно, что на выход попадает какой-то бессмысленный мусор. (Не говоря уже о том, что массив имеет нулевой размер, а вы в него пытаетесь доступаться.)
По тому, как вы щедро используете ссылки в объявлениях параметров вашей функции InputFile
понятно, что вы уже сталкивались с темой "передачи параметров по значению", "передачи параметров по ссылке" и т.п. (Даже в OutputFile
параметр n
передается по ссылке!). А что же вы ваш указатель оставили без такого внимания? Что-то в этом роде вам и надо сделать с вашим указателем тоже, чтобы он возвращался из функции InputFile
обратно в main
, а не превращался в утечку памяти. А выделять в main
массив размера 0 никакого смысла нет.
И int main()
, а не void main()
. И цикл с предусловием "пока не EOF" - практически всегда ошибка в С и С++. И освобождение памяти после new[]
делается через delete[]
, а не через delete
. И с чего это вдруг поток для выполнения форматированного чтения у вас открывается как binary?
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
дано N отрезков на плоскости с началом координат в (0, 0) соответственно, расположение которых может быть абсолютно любым