Как я могу вызвать notepad.exe из программы на C? - PullRequest
5 голосов
/ 14 августа 2011

Я написал программу расписания в 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?

Ответы [ 3 ]

7 голосов
/ 14 августа 2011

Дани уже описал более простой способ (с использованием system), поэтому я просто опишу другой (более сложный, но и более гибкий) способ сделать это с помощью Windows API .Просматривая 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's environment block
    NULL,                      // Use parent's starting directory 
    &si,                       // Pointer to STARTUPINFO structure
    &pi);                      // Pointer to PROCESS_INFORMATION structure

А затем дождитесь завершения процесса «Блокнот», как описано в примере.

7 голосов
/ 14 августа 2011

Используйте

system("notepad.exe aa.txt");
5 голосов
/ 15 августа 2011

Третий способ: используйте функцию оболочки 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 в качестве редактора по умолчанию для текстовых файлов, появится PSPad, а не блокнот.

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

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

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

...