Некорректный вывод данных в файл

215
16 марта 2017, 23:07

Я беру данные из одного файла и записываю в другой:

 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

Answer 1

У вас в функции InputFile выделяется свой собственный массив для чтения данных. Вот в него вы и читаете данные. В функцию main вы этот массив никак не возвращаете - он просто тихо "забывается" (становится утечкой памяти по выходу из InputFile).

Массив, который вы создали ранее в main (размера 0?) ничего об этом не знает и никакого отношения к читаемому из файла массиву не имеет. Он никак ни для чего не используется и никакие данные в него не попадают.

Потом вы пытаетесь посылать на выход в функцию OutputFile именно массив нулевого размера из main. Неудивительно, что на выход попадает какой-то бессмысленный мусор. (Не говоря уже о том, что массив имеет нулевой размер, а вы в него пытаетесь доступаться.)

По тому, как вы щедро используете ссылки в объявлениях параметров вашей функции InputFile понятно, что вы уже сталкивались с темой "передачи параметров по значению", "передачи параметров по ссылке" и т.п. (Даже в OutputFile параметр n передается по ссылке!). А что же вы ваш указатель оставили без такого внимания? Что-то в этом роде вам и надо сделать с вашим указателем тоже, чтобы он возвращался из функции InputFile обратно в main, а не превращался в утечку памяти. А выделять в main массив размера 0 никакого смысла нет.

И int main(), а не void main(). И цикл с предусловием "пока не EOF" - практически всегда ошибка в С и С++. И освобождение памяти после new[] делается через delete[], а не через delete. И с чего это вдруг поток для выполнения форматированного чтения у вас открывается как binary?

READ ALSO
обновление ui из другого класса

обновление ui из другого класса

Взял пример сервера http://wwwvoidrealms

199
Разбить на массивы С++

Разбить на массивы С++

Всем привет ,есть очень интересная задачаЯ её решил,но проходит 52

278
Работа с сокетами в win 10

Работа с сокетами в win 10

Работал с сокетами в C,код идентичен коду с msdn сервер клиент

203
Определение видимости отрезка

Определение видимости отрезка

дано N отрезков на плоскости с началом координат в (0, 0) соответственно, расположение которых может быть абсолютно любым

318