Как я могу вызвать notepad.exe из программы C?

111
6

Я написал программу таблицы времени в c


#include<stdio.h> 
#include<conio.h>
void main()
{
int i=0;
int selection;
char day[20];
char sub1[20];
char sub2[20];
char sub3[20];
FILE *fp;
fp=fopen("aa.txt","w");
textcolor(5);
textbackground(3);
clrscr();
while(i<3)
{
printf("Enter the day ");
scanf("%s",day);
printf("Enter the period 12.30-1:30 ");
scanf("%s",sub1);
printf("Enter the period 1.35-2.40 ");
scanf("%s",sub2);
printf("Enter the period 2.45-3.50 ");
scanf("%s",sub3);
fprintf(fp,"\n %s TIMETABLE IS AS FOLLOWS\n",day);
fprintf(fp,"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
fprintf(fp,"|~~~~~~~~~|~~~~~~~~~~~~~~~|~~~~~~~~~~~~~~|~~~~~~~~~~|\n");
fprintf(fp,"| TIME | 12.30-1.30 | 1.35-2.40 |2.45-3.50 |\n");
fprintf(fp,"|~~~~~~~~~|~~~~~~~~~~~~~~~|~~~~~~~~~~~~~~|~~~~~~~~~~|\n");
fprintf(fp,"| SUBJECT * %s * %s * %s|\n",sub1,sub2,sub3);
fprintf(fp,"|~~~~~~~~~|~~~~~~~~~~~~~~~|~~~~~~~~~~~~~~|~~~~~~~~~~|\n");
i++;
}
printf(" Time table has been Created in the File aa.txt successfully");
getch();
}

когда я заканчиваю расписание. таблица времени создается в файле .txt. Я хочу, чтобы этот файл был открыт и автоматически показывал его в блокноте. как программировать это в c?

спросил(а) 2021-01-19T13:25:01+03:00 9 месяцев назад
1
Решение
130

Дани уже описал более простой способ (используя system), поэтому я просто опишу другой (более сложный, но и более гибкий) способ сделать это, используя API Windows. Просмотр API (Обзор → Системные службы → Процессы и потоки), есть небольшой пример того, как создать процесс с помощью CreateProcess() функция. В вашем случае:


CreateProcess("notepad.exe",   // Name of program to execute
"aa.txt", // Command line
NULL, // Process handle not inheritable
NULL, // Thread handle not inheritable
FALSE, // Set handle inheritance to FALSE
0, // No creation flags
NULL, // Use parent environment block
NULL, // Use parent starting directory
&si, // Pointer to STARTUPINFO structure
&pi); // Pointer to PROCESS_INFORMATION structure

И затем дождитесь завершения процесса Notepad, как описано в примере.

ответил(а) 2021-01-19T13:25:01+03:00 9 месяцев назад
130

Использование

system("notepad.exe aa.txt");

ответил(а) 2021-01-19T13:25:01+03:00 9 месяцев назад
113

Третий способ: используйте ShellExecute функцию оболочки, сообщающую оболочке "просто открыть файл" с помощью редактора по умолчанию:


#include <windows.h>
#include <Shellapi.h>

// ...

if(ShellExecute(
NULL, // No parent window for error message boxes/...
"open", // Shell action ("verb") to be performed on the file (as opposed to "print", "explore", ...)
"aa.txt", // File to be opened
NULL, // Command-line parameters - not used when opening documents
NULL, // Working directory - the current one is used by default
SW_SHOW // State of the window of the application being launched - SW_SHOW is the default
)<=(HINSTANCE)32 // If ShellExecute returns a value <=32 it means that an error has occurred
)
{
puts("Cannot open aa.txt with the default editor - ShellExecute failed.");
}


Это откроет aa.txt с помощью редактора по умолчанию для файлов txt.


На мой взгляд, это лучшее решение:


    он учитывает выбор пользователя для редактора (в отличие от CreateProcess, который только что открывается notepad.exe); если я установил PSPad в качестве редактора по умолчанию для txt файлов, он выведет PSPad, а не блокнот.


    у него нет проблем с путями поиска для редактора (где notepad.exe?)


    его поведение полностью определено, в отличие от функции system, которая полагается на command.com/cmd.exe, которые имеют тонкие различия между версиями Windows и не дают вам документально подтвержденного/простого способа проверить если операция выполнена успешно,


    он не дает вам никакого "ложного ощущения переносимости", такого как system, который будет с удовольствием компилироваться на Linux-машине, но просто не будет работать во время выполнения.


ответил(а) 2021-01-19T13:25:01+03:00 9 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема