1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
//clang Проверка файла но открытость Листинг #1.1 #include <fstream> //Для работы с файлами #include <iostream> //Для работы с клавиатурой и монитором using namespace std; int main(){ ifstream f1; f1.open("C:\\MyFile.txt"); if (!(f1.is_open())){ cout << "File not find\n"; cout << "exit"; cin.get(); //Это если окошко сразу закрывается, задерживаем return -1; } else { cout << "Process began\n"; //Обработка файла cout << "Process finished\n"; } cin.get(); //Это если окошко сразу закрывается, задерживаем } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
//Borland C++ 3.1 Проверка файла но открытость Листинг #1.2 #include <fstream.h> //Для работы с файлами #include <iostream.h> //Для работы с клавиатурой и монитором #include <conio.h> int main(){ clrscr(); ifstream f1; f1.open("C:\\MyFile.txt"); if (!(f1.good())){ cout << "File not find\n"; cout << "exit"; cin.get(); //Чтобы сразу не закрывалось окошко return -1; } else { cout << "Process began\n"; //Обработка файла cout << "Process finished\n"; } cin.get(); return 0; } |
===========================================================================
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
//clang Листинг #2.1 Запись информации в файл Проверки #include <fstream> //Для работы с файлами #include <iostream> //Для работы с клавиатурой и монитором using namespace std; int main(){ const char *PATH = "C:\\MyFile\\1.txt"; const int N = 256; //максимальная длина строки S char S[N] = {}; //Строка, записываемая в файл unsigned short ERROR = 0; //Это переменная для отслеживания ошибки ofstream f1(PATH); //f1 у нас воплощает сам файл if (f1.is_open()){ //Если воплощение файла засуществовало (т. е. если файл открылся), то выполняем блок действий for (int i=0; i< 10; i++){ cout << "S[" << i << "]: "; cin.getline(S, N); f1 << S << '\n'; }; } else { ERROR = 1; //Если воплощение файла не засуществовало, то обозначаем это } switch (ERROR){ case 1: cout << "file no opened\n"; break; //Обозначаем, что файл не открылся case 2: cout << "file corrupted\n"; break; //Обозначаем, что файл открылся, но что-то с ним случилось } f1.close(); //Завершаем работу с f1 if (!ERROR){ //Если не произошло ошибки, то выполняет блок действий //тут можно работать с массивом, заполненным из файла, например } cin.get(); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
//clang Листинг #2.2 Чтение файла Проверки #include <fstream> //Для работы с файлами #include <iostream> //Для работы с клавиатурой и монитором using namespace std; int main(){ const char *PATH1 = "C:\\MyFiles\\1.txt"; const int N = 256; //максимальная длина строки S char S[N] = {}; //Строка, записываемая в файл unsigned short ERROR = 0; //Это переменная для отслеживания ошибки ifstream f1(PATH1); //f1 у нас воплощает сам файл if (f1.is_open()){ //Если наша программа смогла открыть файл, то выполняеи блок действий while (f1.good()){ //Пока ввод успешен и не достигнут конец файла, читаем из файла данные // f1 >> S; //читаем f1.getline(S,N); cout << S << '\n'; } if (!f1.eof()){ //Если НЕ достигнут конец файла, то выполняем блок действий if (f1.fail()){ ERROR = 2; //Если считываемое значение не соответствует типу принимающего значение } else{ ERROR = 3; //Обозначаем неизвестную ошибку } } } else { ERROR = 1; //1 будет обозначать, что наша программа файл открыть не смогла } switch (ERROR){ case 1: cout << "file no opened\n"; break; //Обозначаем, что файл не открылся case 2: cout << "Input terminated by data mismatch.\n"; break; //Обозначаем, что сбор информации прерван из-за несоответствия типов case 3: cout << "unknown error.\n"; break; //Обозначаем, что сбор информации прерван из-за неопознанной ошибки } f1.close(); //Завершаем работу с f1 if (!ERROR){ //Если не произошло ошибки, то выполняет блок действий //тут можно работать с массивом, заполненным из файла, например } cin.get(); } |
1 2 3 4 5 6 7 8 9 10 11 |
while (f1.good){...} if (inFile.eof ()) // Достигнут конец файла cout << "End of file reached. \n"; else if (inFile.fail ()) // Ввод прекращен из-за несоответствия типа данных cout << "Input terminated by data mismatch.\n"; else // Ввод прекращен по неизвестной причине cout << "Input terminated for unknown reason.\n"; |
1 2 3 4 5 |
//Листинг #a1.1 f >> value; while (f.good()){ //чтение и проверка успешности f >> value; //читаем из файла значение в переменную value } |
1 2 3 4 |
//Листинг #a1.2 //предпочтительная форма форме 1.1 while (f >> N){ //чтение и проверка успешности тело цикла } |
1 2 3 4 5 |
//Листинг #a2.1 f.getline(value,N); while (f.good()){ //чтение строки и проверка успешности f.getline(value,N); //читаем из файла значение в переменную value } |
1 2 3 4 |
//Листинг #a2.2 //предпочтительная форма форме 2.1 while (f.getline(S,N)){ //чтение и проверка успешности тело цикла } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 |
//clang Листинг #3 Запись и чтение (объединяем в одну программу) #include <fstream> //Для работы с файлами #include <iostream> //Для работы с клавиатурой и монитором using namespace std; int main() { const char *PATH = "C://MyFiles//2.txt"; const int N = 256; //максимальная длина строки S char S[N] = {}; //Строка, записываемая в файл unsigned short ERROR = 0; //Это переменная для отслеживания ошибки ofstream f1; //f1 у нас воплощает сам файл, с которого будем читать ifstream f2; //f2 то же самое воплощение, но для записи unsigned short count = 0; //Это счётчик значений, прочитанных из файла unsigned short select; //Это переменная для выбора, будем делать мини-меню cout << "1. Read file" << endl; cout << "2. write file" << endl; (cin >> select).get(); if (2 == select) { f1.open(PATH); //Если выбрали 2, то записываем if (f1.is_open()) { //Если воплощение файла засуществовало (т. е. если файл открылся), то выполняем блок действий for (int i = 0; i< 10; i++) { cout << "S[" << i << "]: "; cin.getline(S, N); f1 << S << '\n'; }; } else { ERROR = 1; //Если воплощение файла не засуществовало, то обозначаем это } f1.close(); } //end if 2 == select else if (1 == select) { cout << "\n===========\nstart read\n===========\n"; f2.open(PATH); if (f2.is_open()) { //Если наша программа смогла открыть файл, то выполняеи блок действий while (f2.getline(S, N)) { //Пока ввод успешен и не достигнут конец файла, читаем из файла данные cout << S << '\n'; count++; } if (!f2.eof()) { //Если НЕ достигнут конец файла, то выполняем блок действий if (f2.fail()) { ERROR = 2; //Если считываемое значение не соответствует типу принимающего значение } else { ERROR = 3; //Обозначаем неизвестную ошибку } } } else { ERROR = 1; //1 будет обозначать, что наша программа файл открыть не смогла } f2.close(); cout << "\n===========\nend read\n===========\n"; } switch (ERROR) { case 1: cout << "file no opened\n"; break; //Обозначаем, что файл не открылся case 2: cout << "file corrupted\n"; break; //Обозначаем, что файл не открылся case 3: cout << "unknown error\n"; break; //Обозначаем, что ошибка неопознана } if (!ERROR) { //Если не произошло ошибки, то выполняет блок действий //тут можно работать с массивом, заполненным из файла, например if (!count) cout << "Empty file\n"; //Если ошибок не возникло, то скорее всего файл пустой cout << "finished\n"; cout << "read " << count << "value" << '\n'; //было прочитано count значений } cin.get(); } |
1 2 3 |
unsigned short ERROR = 0; //Это переменная для отслеживания ошибки ofstream f1(PATH); //f1 у нас воплощает сам файл, с которого будем читать ifstream f2; |
подскажите, что делает (return -1) и тогда соответственно (return 0)?
В моём случае ничего полезного.
return 0, используемое в функции main(), только-лишь сообщает операционной системе, что программа успешно завершилась.
return -1 могло бы использоваться для работы с внешними программами. Т. е. какая-нибудь внешняя программа могла бы использовать написанную мной, по -1 можно было бы легко выявить, что моя эта программа задачу свою не выполнила и, например, сообщить об этом пользователю. -1 необязательное значение, а взятое с потолка. Т. е. любое можно использовать, достаточно будет знать, что оно должно обозначить (в моём случае неоткрытие файла).
что то не пойму как организовать в проге проверку методом fail(). он пишется после цикла считывания с файла или само считывание пишется в- цикл() {if ( f2.fail() ){ f2.get() = переменная;}} ?
что то не пойму как организовать в проге проверку методом fail(). он пишется после цикла считывания с файла или само считывание пишется в- цикл() {if ( f2.fail() ){ f2.get() = переменная;}} ?
У меня в примере сначала проверяется, что файл успешно открыт. Потом проверяется fail, т. е. успешность прочитанности значения. В случае неуспеха выбирается поведение диагностики ошибки. В моём случае ошибке присваивается номер и запоминается в переменную ERROR.
fail переводится как неудача. Если компилятор прочитал что смог и всё поломалось, то или достигнут конец файла, или не соответствует тип для записи в переменную значения. Поскольку дальнейшее чтение не имеет смысла, нужно зафиксировать проблему удобным способом.
admin, я больше интересовался для выхода из цикла «фэйлом», если прочитанный символ в переменную из файла оказался не того типа как у переменной; если это имеет смысл вообще
Если проверять на fail(), то это как проверять на eof().
Только fail() включает в себя и проверку на eof() и проверку на успешное считывание.
Я не могу понять, чего Вы понять не можете.
я написал программу в которой хотел, чтоб если на пути считывания f2.get()-ом в переменную типа чар попадала цифра, то считывание прекращалось и выводило на каком символе произошел конец. но у меня несколько раз, то ничего не выводило, то выводило все подряд до EOF
char — целочисленный тип.
цифра — целое число
Читаем в целочисленный тип целое число и ждём, что сломается? Не дождётесь.
а разве char это не символьный тип?
Я его называю целочисленным типом с символьным представлением. Т. е. для компьютера он ничем не отличается от числа, а для нас как символ.
То, что мы его видим как символ, — это только умение cout его так выводить.
Программисты С, например, сами указывают какой тип ожидается на выходе (у них нету cout).
Всё, что можно делать с целыми числами, — всё можно делать с типом char.
Называем мы этот тип символьным скорее по традиции и для ясности, но не потому что так есть на самом деле.