Завершим главу, посвященную интерполяции и регрессии, реализации в Mathcad функции ввода/вывода во внешние файлы, поскольку, как правило, анализ данных чаще всего связан с их импортом из внешних источников (например, результатов эксперимента из текстовых или графических файлов) и экспортом на внешние носители. В большинстве случаев ввод внешних данных в документы Mathcad применяется чаще вывода, поскольку Mathcad имеет гораздо лучшие возможности представления результатов расчетов, чем многие пользовательские программы. Для общения с внешними файлами данных в Mathcad имеет несколько разных способов, причем в новой 12-й версии добавлены новые, намного более удобные опции импорта.
Перечислим встроенные функции для работы с текстовыми файлами, которые имеются в Mathcad 2001-12.
Примечание
В Mathcad 12 имеется дополнительная универсальная встроенная функция READFILE, значительно облегчающая процесс импорта данных.
- READPRN(«fiie») – чтение данных в матрицу из текстового файла.
- WRITEPRN(«file») – запись данных в текстовый файл.
- APPENDPRN («file») – дозапись данных в существующий текстовый файл:
- file – путь к файлу.
Примечание
LabView. Ввод/вывод в текстовые файлы (Text File I/O)
Можно задавать как полный путь к файлу, например, С:Мои документы, так и относительный, имея в виду, что он будет отсчитываться от папки, в которой находится файл с документом Mathcad. Если вы задаете в качестве аргумента просто имя файла (как в листингах 13.16-13.17), то файл будет записан или прочитан из той папки, в которой находится сам документ Mathcad.
Примеры использования встроенных функций иллюстрируются, листингами 13.16-13.18. Результат действия листингов 13.16 и 13.18 можно понять, просмотрев получающиеся текстовые файлы, например, с помощью Блокнота Windows (рис. 13.20 и 13.21 соответственно).
Листинг 13.16. Запись матрицы в текстовый файл:
Рис. 13.20. Файл, созданный листингом 13.16
Листинг 13.17. Чтение данных из текстового файла в матрицу:
Листинг 13.18. Дозапись вектора k в существующий текстовый файл:
Рис. 13.21. Файл, созданный листингами 13.16 и 13.18
Обратите внимание, что, если вы выводите данные в файл, пользуясь встроенной функцией WRITEPRN, то в любом случае создается новый текстовый файл. Если даже до записи данных файл с таким именем существовал, то его содержимое будет уничтожено, заменившись новыми данными. Если вы хотите сохранить прежнее содержимое текстового файла с данными, пользуйтесь функцией APPENDPRN. Эта встроенная функция может применяться и для создания нового файла. Иными словами, если файла с заданным именем не существовало, то он будет создан и наполнен теми данными, которые вами определены в документе.
Примечание
Создание нового файла путем использования функции APPENDPRN добавлено разработчиками только в версии Mathcad 11. В прежних версиях программы попытка добавить данные к несуществующему файлу при помощи этой функции вызовет сообщение об ошибке.
Работа с файлами в Python. Создание, чтение, запись, удаление. Конструкция WITH-AS | Базовый курс
Источник: samoychiteli.ru
Запись результата вычисления в текстовый файл
Здравствуйте, хотел узнать, как записать результат вычислений в текстовый файл.
Вот мой примитивный калькулятор:
#include #include #include using namespace std; int main() < setlocale(LC_ALL,»RUS»); double a=0,b=0,c=0; char d; printf («Введите выражение»); cin>>a>>d>>b; switch (d) < case ‘+’: c=a+b; cout return 0; >
Подскажите пожалуйста ещё кое что:
- как записать переменные и результат вычислений в одномерный массив?
- как можно введённое в консоль выражение, например: (54-3*6)/2
Как тут распознать символы и определить их автоматически, что бы потом можно было просто вычислить?
Я думал может быть записать введённую строку в массив, а потом вывести с распознанными символами Double и char. Стоит ли записывать знаки в символьный вид, или они в отдельную категорию входят?
Спасибо за внимание.
Будет лучше если вводить будем строку а не по символу.
a) d[1] = c; //example
b) (54 — 3 * 6) / 2, тут надо проверить все if’ом, прочитать целиком строку, и найти доминирующее выражение(В данном случае скобки, а в скобках умножение, затем только деление)
с) Насколько я знаю, строку в массив не запихнуть, строка это string.
#include #include #include #include using namespace std; int main() < setlocale(LC_ALL,»RUS»); double a=0,b=0,c=0; char d; printf («Введите выражение»); cin>>a >>d >>b; switch (d) < case ‘+’: c=a+b; cout return 0; >
- Кажется не работает. Вставил в новый файл, скомпилировал, запустил, файл с записью не создаётся, создал вручную в той же папке 123.txt, и снова ничего.
b) (54 — 3 * 6) / 2, тут надо проверить все if’ом, прочитать целиком строку, и найти доминирующее выражение(В данном случае скобки, а в скобках умножение, затем только деление)
- Можно по подробнее, как это прочитать строку. Я помню про Scanf(), но с помощью него можно прочесть только выражения заранее предсказанной длинны и конструкции. Я же хотел бы вне зависимости от количества символов в выражении смочь прочесть её.
с) Насколько я знаю, строку в массив не запихнуть, строка это string.
- Можно ли тогда разделить строку посимвольно и запихнуть в массив или вектор, если вас не затруднит по подробнее расскажите.
Извините я ещё зелен в с++, чуток совсем знаю)
поправил, извините за мультипост
Насколько я знаю, строку в массив не запихнуть, строка это string.
Любая строка, на низком уровне языка, есть массив символов. Класс string просто облегчает нам работу со строками. Но не суть.
как можно введённое в консоль выражение, например: (54-3*6)/2
По-простому никак. Нужно писать парсер, который будет анализировать строку и вычленять из нее данные.
Вот пример парсера для систем уравнений, который умеет подобные слагаемые 🙂
Записать что-то в файл можно через Сишную функцию fputs, или через std::fstream .
Скопировал код, при запуске пишет «нет доступа к файлу!» Ни создаёт ни записывает при созданном файле.
Покажите, как вы пишете данные в файл.
#include #include using namespace std; int main() < setlocale(0,»»); char * fileName = «C:\Games\example.txt»; FILE * file = fopen(fileName, «w»); if (file) < char * str = «I Like The Coding!»; bool result = fputs(str, file); if (!result) cout else cout
Просто копирую со страницы с уроком.
Eskel, судя по имени файла, ты сидишь под Виндой, и скорее всего это W7 или W8. От Висты и выше операционки очень ревностно относятся к записи файла «не туда». Особенно это касается диска C. Если у тебя система установлена с настройками по умолчанию, попробуй указать имя файла либо вообще без пути, тогда файл должен быть записан в каталог запуска программы (например в тот, где лежит исполняемый файл), либо указать такой путь для файла, который явно разрешён для твоей учётной записи (например c:users\Documents. ).
Ещё пара уточнений по программе.
(1) Вызов fclose(file) лучше перенести в блок if (file) , поскольку если файл не открыт, то и закрывать его не надо. В данном случае это не особо важно, поскольку fclose() не возбуждает исключение, если закрываемый файл не открыт, но лучше писать аккуратно.
char * str = «I Like The Coding!»;
теперь deprecated, т.е. «не рекомендуемый». Что бы компилятор не давал предупреждений надо писать так:
char str1[] = «I Like The Coding!»; // для строк, которые предполагается модифицировать char *c = str1; // работает нормально: символы строки можно читать и записывать // или так: const char *str2 = «I Like The Coding!»; // для константных строк char *c = str2; // компилятор даёт ошибку «неправильное преобразование указателя» // однако явное преобразование типа указателя char *c = (char *)str2; // компилятор пропускает, // но содержимое строки доступно только для чтения // при попытке записи возбуждается исключение
Спасибо за предложенные варианты.
У меня семёрка, попробовал как вы сказали, но всё равно нет доступа к файлу(
Вот как я ввёл первый вариант:
#include #include using namespace std; int main() < setlocale(0,»»); char * fileName = «C:Gamesexample.txt»; FILE * file = fopen(fileName, «w»); if (file) < char str1[] = «I Like The Coding!»; char *c = str1; bool result = fputs(str1, file); if (!result) < cout > else cout
#include #include using namespace std; int main() < setlocale(0,»»); // бэкслэши в данном случае должны быть сдвоенными! // char fileName[] = «C:\Games\example.txt»; char fileName[] = «example.txt»; FILE * file = fopen(fileName, «w»); if (file) < char str1[] = «I Like The Coding!»; bool result = fputs(str1, file); if (!result) < cout fclose(file); > else cout
Благодарю, теперь получается записать, но только если указывать не путь к файлу а только название, то есть:
char fileName[] = «example.txt»;
При указании адреса файла, по прежнему не записывает.
Либо (1) пытаешься записать файл в запрещённое, с точки зрения Винды, место, либо (2) не правильно указываешь путь, например с одиночными бэкслэшами, как в твоём посте от 15.12.13.
Есть вопрос немного не по теме, хочу сделать что то типа калькулятора, с помощью борланд билдера, поставил на форму Edit1, Button1 и Label1. Пишу код в кнопку:
#include #include #pragma hdrstop #include «Unit1.h» //——————————————————— ——————- #pragma package(smart_init) #pragma resource «*.dfm» TForm1 *Form1; //————————————————————————— __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) < >//————————————————————————— void __fastcall TForm1::Button1Click(TObject *Sender) < int x, y; y=Edit1->Text.ToDouble(); x=y; Label1->Caption=x; > //—————————————————————————
Предполагаю, что записанное в Эдит1 выражение, хотя бы 2+2, должно рассчитываться как если бы я вставил туда переменные для уравнения, то есть за место переменных я пытаюсь ввести всё уравнение, но выдаётся ошибка:
«is not a valid floating point value», то есть «не является допустимым значением с плавающей точкой», хотя я по умолчанию забыл все переменные как «double», но выражение с плавающей точкой это же float? Помогите мне доделать программу и пожалуйста разъясните что именно я сделал не так.
Борланд Билдер, в свою очередь, предполагает, что в Эдит1 пользователем введена строка. И он, на самом деле, прав.
Почему ты считаешь, что выражение, введённое в Эдит1 вообще должно как-то интерпретироваться?
Если ты вводишь в поле число (возможно с десятичной точкой), то метод ToDouble() вернёт тебе число с плавающей точкой двойной точности (которое ты присваиваешь переменной целого(!) типа). Кстати, заметь, что этот метод принадлежит свойству Text, что подсказывает, что данные там хранятся в виде строки. Если метод ToDouble() не может обработать строку как число с плавающей точкой, то выдаёт ошибку, которую ты и наблюдаешь. Всё законно.
float — тип числа с плавающей точкой одинарной точности.
double — тип числа с плавающей точкой двойной точности.
Если ты хочешь получать от строки ввода (TEdit) результат вычисления выражения, то надо от TEdit унаследовать новый класс и добавить в него недостающую функциональность. Т.е. в первую очередь парсер арифметических выражений и, видимо, ещё кой-какую обвязку. Но я бы, наверное, сделал это отдельно от TEdit, получая на вход строку из поля ввода и возвращая результат или флаг ошибки.
PS. С Borland C++ Builder очень давно не работал, поэтому в каких-то деталях могу быть неточным.
Запись в текстовый файл.
Из прошых уроков мы научились открывать файл для чтения с помощью процедуры Reset. Однако текстовый файл можно открывать не только для чтения, но и для записи в него информации. Для записи информации в файл используется процедура Rewrite.
Запись в текстовый файл.
Program file6; Uses crt; var fl:text; str:string; begin clrscr; assign (fl, ‘programstext.txt’); rewrite (fl); read (str); write (fl,str); close(fl); end.
В строке №8 записываем процедуру Rewrite. Данная процедура открывает файл, указанный в скобках после слова Rewrite, для записи в него информации. В нашем случае в скобках после слова Rewrite стоит переменная «fl», которая связана с текстовым файлом «text.txt» с помощью процедуры Assign (строка №7). Поэтому этот текстовый файл и будет открыт для записи.
Строка №9. Процедура Read обеспечивает ввод строковой информации (после слова Read в круглых скобках стоит строковая переменная str). Благодаря этой процедуре мы сможем вводить с клавиатуры различные слова. Эти слова будут записаны в строковую переменную «str»
Строка №10. Процедура Write обеспечивает запись информации в текстовый файл. Запись в строке №10 означает, что в текстовый файл («fl») будет записана информация из переменной «str» (т.е. та информация, которую мы введем с клавиатуры).
После запуска программы введите какое-нибудь слово (например, «programmirovanie») и нажмите Enter.
Теперь посмотрим наш текстовый файл «text.txt» (C:FPC2.2.2bini386-win32Programs). Если вы помните, то после прошлого урока там были записаны слова «pascal», «admin» и «turbo». Теперь в файле «text.txt» записано слово «programmirovanie»
Это означает, что процедура Rewrite позволяет записывать информация в файл, но при этом удаляет всю старую информацию (Rewrite с англ. «перезаписывать»).
Дополнение к материалу.
Попробуйте удалить файл «text.txt» из директории C:FPC2.2.2bini386-win32Programs. Теперь запустите программу из этого урока. Как видите, программа работает, хотя самого файла не существует. Теперь зайдите в директорию C:FPC2.2.2bini386-win32Programs. Наш файл «text.txt» находится в том месте, откуда мы его удалили.
Дело в том, что если файла не существует, то при использовании процедуры Rewrite он будет создан автоматически (имя файла и его расположение указывается в процедуре Assign).
Источник: mojainformatika.ru