struct student{
char name[20];
char course[20];
int age;
float gpa;
};
using namespace std;
main()
{
ifstream infile;
infile.open("student data.txt");
ofstream outfile;
outfile.open("student data 2.txt");
if (!infile || !outfile)
{
cout << "error opening or creating file" << endl;
exit(1);
}
student stu[2];
infile.seekg(0, ios::beg);
while(!infile.eof())
{
int i;
for(i=0; i<=2; i++)
{
infile >> stu[i].name;
infile >> stu[i].course;
infile >> stu[i].age;
infile >> stu[i].gpa;
}
}
outfile.seekp(0, ios::beg);
int i =0;
while(i<3)
{
outfile << stu[i].name << endl;
outfile << stu[i].course << endl;
outfile << stu[i].age << endl;
outfile << stu[i].gpa << endl;
i++;
}
infile.close();
outfile.close();
}
Я пытаюсь понять, почему этот код не работает ... он не дает никаких ошибок компиляции, но когда я запускаю приложение, оно перестает работать. Он говорит, что raw.exe (имя приложения) не работает. может кто-нибудь помочь :(
Он даже не будет компилироваться как код C++ - пожалуйста, отредактируйте его, чтобы он работал.
Предпочитайте использовать std::string для текста, это избавит вас от многих проблем (например, при переполнении буфера).
обе эти петли работают нормально. цикл for выполняется три раза, затем завершается, а затем мы достигаем конца файла, поэтому цикл while также завершается. половина кода работает нормально (до попадания данных в структуру). записывающая часть в выходной файл (данные о студентах 2.txt) не работает. и это не дает никаких ошибок компилятора.
IMHO, вы должны перегрузить operator>> в своем классе. Сохраняйте знания о членах данных класса внутри класса; класс знает, как читать элементы данных.
Предпочтительнее использовать std::vector, чем массивы. Массивы имеют фиксированный размер и страдают от проблем с переполнением буфера (и количество допустимых элементов не определено).
Ваша проблема - индексы. Вы создаете массив из двух структур student stu[2];. Затем вы заполняете его тремя for(i=0; i<=2; i++).
Я также должен сказать, что было бы намного легче помочь, если бы вы (1) вставили код, который действительно компилируется (включая #include ...), и (2) если вы поделитесь какими-либо входными данными, необходимыми для воспроизведения вашей проблемы (содержимое "student data.txt").
его #include <iostream>, <fstream> и <stdlib.h>. входные данные во входном файле: nasir CS201 23 3 Jamil CS201 31 4 Faisal CS201 25 3.5
fcooper8472 .... я думаю, что количество массивов начинается с 0. и есть три массива. stu [0], stu [1], stu [2].
может ли кто-нибудь просто отредактировать мой код и дать мне посмотреть, пожалуйста ...
user8541301 спасибо, что указали на цикл while .. это не было неправильным, но бесполезным здесь.
@ Mr.bunty lol, да, счетчик массивов начинается с 0, но если вы не знаете, как char myarray[10] дает вам индексы от 0 до 9, перейдите на справочный веб-сайт C++ и узнайте, как работает C++, прежде чем размещать здесь. Если вы объявляете массив размером 2, а индекс начинается с 0, почему вы думаете, что размер волшебным образом становится равным 3? "а есть три массива". Нет, вы объявили массив размером 2, есть два объекта. Один с индексом 0, а другой с индексом 1.
Большое спасибо mpops и fcooper8472 ... я только что сделал глупую ошибку при индексировании массива. спасибо, парни, и извините fcooper8472, если мой вышеупомянутый комментарий вас оскорбил, :)





Хорошо, это, к счастью, очень простое решение! Проблема, с которой вы столкнулись, связана с управлением памятью. Эта строка вызывает у вас все проблемы:
student stu[2];
А ТАКЖЕ
int i =0;
while(i<3)
По сути, вы инициализируете 2 структуры (индексы 0-1) типа student, а затем ожидаете перебора 3 структур (из индекса 0-2). При попытке чтения в третьей структуре вы можете получить ошибку нарушения доступа к памяти.
Итак, я запустил ваш код с этим текстом в "student data.txt"
nasir CS201 23 3
Jamil CS201 31 4
Faisal CS201 25 3.5
Когда были инициализированы только две структуры, «данные студента 2» оставались пустыми. Однако при увеличении значения до student stu[3]; "данные студента 2.txt" дали следующий результат:
nasir
CS201
23
3
Jamil
CS201
31
4
Faisal
CS201
25
3.5
Вот код, который я использовал для создания успешной версии вашей программы с парочкой дополнительных printf для отладки.
#include <iostream>
#include <fstream>
struct student {
char name[20];
char course[20];
int age;
float gpa;
};
using namespace std;
int main()
{
ifstream infile;
infile.open("student data.txt");
ofstream outfile;
outfile.open("student data 2.txt");
if (!infile || !outfile)
{
cout << "error opening or creating file" << endl;
exit(1);
}
student stu[3]; //NOTE THIS LINE NOW HAS 3 STRUCTS INITIALIZED
infile.seekg(0, ios::beg);
while (!infile.eof())
{
int i;
for (i = 0; i <= 2; i++)
{
infile >> stu[i].name;
infile >> stu[i].course;
infile >> stu[i].age;
infile >> stu[i].gpa;
printf("%s %s %d %f\n", stu[i].name, stu[i].course, stu[i].age, stu[i].gpa);
}
}
outfile.seekp(0, ios::beg);
int i = 0;
while (i<3)
{
outfile << stu[i].name << endl;
outfile << stu[i].course << endl;
outfile << stu[i].age << endl;
outfile << stu[i].gpa << endl;
printf("%s %s %d %f\n", stu[i].name, stu[i].course, stu[i].age, stu[i].gpa);
i++;
}
infile.close();
outfile.close();
return 1;
}
Надеюсь это поможет!
Большое спасибо, чувак ... вы указали правильную проблему, но эта проблема уже решена, как вы можете видеть в комментариях. в любом случае большое спасибо. :)
while(!infile.eof())в сочетании сfor(i=0; i<=2; i++)кажется немного странным. В циклеforвы можете попытаться прочитать за конец файла, прежде чем вы вернетесь к проверке конца файла. И несколько слов экспертов по использованиюwhile(!infile.eof()): Почему iostream :: eof внутри условия цикла считается неправильным?