1. c語言 文本編輯器 完整編程
emacs
2. 用C語言編寫一個簡單的文本編輯器.
我的C語言是自學的,懂一小點。雖然我沒有你說的那種源代碼,但我有記事本的源代碼,你想看看嗎?
記事本(主程序)
#include <windows.h>
#include "sample.h"
static char g_szClassName[] = "MyWindowClass";
static HINSTANCE g_hInst = NULL;
#define IDC_MAIN_TEXT 1001
BOOL LoadFile(HWND hEdit, LPSTR pszFileName)
{
HANDLE hFile;
BOOL bSuccess = FALSE;
hFile = CreateFile(pszFileName, GENERIC_READ, FILE_SHARE_READ, NULL,
OPEN_EXISTING, 0, 0);
if(hFile != INVALID_HANDLE_VALUE)
{
DWORD dwFileSize;
dwFileSize = GetFileSize(hFile, NULL);
if(dwFileSize != 0xFFFFFFFF)
{
LPSTR pszFileText;
pszFileText = (LPSTR)GlobalAlloc(GPTR, dwFileSize + 1);
if(pszFileText != NULL)
{
DWORD dwRead;
if(ReadFile(hFile, pszFileText, dwFileSize, &dwRead, NULL))
{
pszFileText[dwFileSize] = 0;
if(SetWindowText(hEdit, pszFileText))
bSuccess = TRUE;
}
GlobalFree(pszFileText);
}
}
CloseHandle(hFile);
}
return bSuccess;
}
BOOL SaveFile(HWND hEdit, LPSTR pszFileName)
{
HANDLE hFile;
BOOL bSuccess = FALSE;
hFile = CreateFile(pszFileName, GENERIC_WRITE, 0, 0,
CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
if(hFile != INVALID_HANDLE_VALUE)
{
DWORD dwTextLength;
dwTextLength = GetWindowTextLength(hEdit);
if(dwTextLength > 0)
{
LPSTR pszText;
pszText = (LPSTR)GlobalAlloc(GPTR, dwTextLength + 1);
if(pszText != NULL)
{
if(GetWindowText(hEdit, pszText, dwTextLength + 1))
{
DWORD dwWritten;
if(WriteFile(hFile, pszText, dwTextLength, &dwWritten, NULL))
bSuccess = TRUE;
}
GlobalFree(pszText);
}
}
CloseHandle(hFile);
}
return bSuccess;
}
BOOL DoFileOpenSave(HWND hwnd, BOOL bSave)
{
OPENFILENAME ofn;
char szFileName[MAX_PATH];
ZeroMemory(&ofn, sizeof(ofn));
szFileName[0] = 0;
ofn.lStructSize = sizeof(ofn);
ofn.hwndOwner = hwnd;
ofn.lpstrFilter = "文本文件 (*.txt)\0*.txt\0所有文件 (*.*)\0*.*\0\0";
ofn.lpstrFile = szFileName;
ofn.nMaxFile = MAX_PATH;
ofn.lpstrDefExt = "txt";
if(bSave)
{
ofn.Flags = OFN_EXPLORER | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY |
OFN_OVERWRITEPROMPT;
if(GetSaveFileName(&ofn))
{
if(!SaveFile(GetDlgItem(hwnd, IDC_MAIN_TEXT), szFileName))
{
MessageBox(hwnd, "保存文件失敗.", "錯誤信息",
MB_OK | MB_ICONEXCLAMATION);
return FALSE;
}
}
}
else
{
ofn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
if(GetOpenFileName(&ofn))
{
if(!LoadFile(GetDlgItem(hwnd, IDC_MAIN_TEXT), szFileName))
{
MessageBox(hwnd, "打開文件失敗.", "錯誤信息",
MB_OK | MB_ICONEXCLAMATION);
return FALSE;
}
}
}
return TRUE;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam)
{
switch(Message)
{
case WM_CREATE:
CreateWindow("EDIT", "",
WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL | ES_MULTILINE |
ES_WANTRETURN,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
hwnd, (HMENU)IDC_MAIN_TEXT, g_hInst, NULL);
SendDlgItemMessage(hwnd, IDC_MAIN_TEXT, WM_SETFONT,
(WPARAM)GetStockObject(DEFAULT_GUI_FONT), MAKELPARAM(TRUE, 0));
break;
case WM_SIZE:
if(wParam != SIZE_MINIMIZED)
MoveWindow(GetDlgItem(hwnd, IDC_MAIN_TEXT), 0, 0, LOWORD(lParam),
HIWORD(lParam), TRUE);
break;
case WM_SETFOCUS:
SetFocus(GetDlgItem(hwnd, IDC_MAIN_TEXT));
break;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case CM_FILE_OPEN:
DoFileOpenSave(hwnd, FALSE);
break;
case CM_FILE_SAVEAS:
DoFileOpenSave(hwnd, TRUE);
break;
case CM_FILE_EXIT:
PostMessage(hwnd, WM_CLOSE, 0, 0);
break;
case CM_ABOUT:
MessageBox (NULL, "歡迎使用jiyingjun的源代碼" , "關於...", 0);
}
break;
case WM_CLOSE:
DestroyWindow(hwnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd, Message, wParam, lParam);
}
return 0;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
WNDCLASSEX WndClass;
HWND hwnd;
MSG Msg;
g_hInst = hInstance;
WndClass.cbSize = sizeof(WNDCLASSEX);
WndClass.style = 0;
WndClass.lpfnWndProc = WndProc;
WndClass.cbClsExtra = 0;
WndClass.cbWndExtra = 0;
WndClass.hInstance = g_hInst;
WndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
WndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
WndClass.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
WndClass.lpszMenuName = "MAINMENU";
WndClass.lpszClassName = g_szClassName;
WndClass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
if(!RegisterClassEx(&WndClass))
{
MessageBox(0, "注冊窗口失敗", "錯誤信息",
MB_ICONEXCLAMATION | MB_OK | MB_SYSTEMMODAL);
return 0;
}
hwnd = CreateWindowEx(
WS_EX_CLIENTEDGE,
g_szClassName,
"記事本",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, 800, 600,
NULL, NULL, g_hInst, NULL);
if(hwnd == NULL)
{
MessageBox(0, "創建窗口失敗", "錯誤信息",
MB_ICONEXCLAMATION | MB_OK | MB_SYSTEMMODAL);
return 0;
}
ShowWindow(hwnd, nCmdShow);
UpdateWindow(hwnd);
while(GetMessage(&Msg, NULL, 0, 0))
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
return Msg.wParam;
}
記事本(資源文件)
#include "sample.h"
A ICON MOVEABLE PURE LOADONCALL DISCARDABLE "sample.ico"
MAINMENU MENU
{
POPUP "文件(&F)"
{
MENUITEM "打開(&O)...", CM_FILE_OPEN
MENUITEM "另存為(&S)...", CM_FILE_SAVEAS
MENUITEM SEPARATOR
MENUITEM "關閉", CM_FILE_EXIT
}
POPUP "幫助(&H)"
{
MENUITEM "關於(&A)", CM_ABOUT
}
}
記事本(頭文件)
#define CM_FILE_SAVEAS 9072
#define CM_FILE_EXIT 9071
#define CM_FILE_OPEN 9070
#define CM_ABOUT 9069
3. 求c語言寫的文本編輯器
本題的一個完整的c程序如下,win-tc和Dev-c++下運行通過。
#include <stdio.h>
#define MAXLEN 80
#define MAXLINE 200
char buffer[MAXLEN],fname[120];
char *lineptr[MAXLINE];
FILE *fp;
void edit(),replace(),insert(),delete(),quit();
char comch[]="EeRrIiDdQq";/*命令符*/
void(*comfun[])()={edit,replace,insert,delete,quit};/*對應處理函數*/
int modified=0,/*正文被修改標志*/
last;/*當前正文行數*/
char *chpt;/*輸入命令行字元指針*/
main()
{
int j;
last=0;
while(1)
{
printf("\nInput a command:[e,r,i,d,q].\n");
gets(buffer);/*讀入命令行*/
for(chpt=buffer;*chpt==''||*chpt=='\t';chpt++);/*掠過空白符*/
if(*chpt=='\0') continue;/*空行重新輸入*/
for(j=0;comch[j]!='\0'&&comch[j]!=*chpt;j++);/*查命令符*/
if(comch[j]=='\0') continue;/*非法命令符*/
chpt++;/*掠過命令符,指向參數*/
(*comfun[j/2])();/*執行對應函數*/
fprintf(stdout,"The text is:\n");
for(j=0;j<last;j++)/*顯示正文*/
fputs(lineptr[j],stdout);
}
}
void quit()
{
int c;
if(modified)/* 如正文被修改 */
{
printf("Save? (y/n)");
while(!(((c=getchar())>='a'&&c<='z')||(c>='A'&&c<='Z')));
if(c=='y'||c=='Y')
save(fname); /* 保存被修改過的正文 */
}
for(c=0;c<last;c++)
free(lineptr[c]); /* 釋放內存 */
exit(0);
}
void insert()
{
int k,m,i;
sscanf(chpt,"%d%d",&k,&m); /* 讀入參數 */
if(m<0||m>last||last+k>=MAXLINE)/* 檢查參數合理性 */
{
printf("Error!\n");
return;
}
for(i=last;i>m;i--)/* 後繼行向後移 */
lineptr[i+k-1]=lineptr[i-1];
for(i=0;i<k;i++) /* 讀入k行正文,並插入 */
{
fgets(buffer,MAXLEN,stdin);
lineptr[m+i]=(char *)malloc(strlen(buffer)+1);
strcpy(lineptr[m+i],buffer);
}
last+=k; /* 修正正文行數 */
modified=1; /* 正文被修改 */
}
void delete()
{
int i,j,m,n;
sscanf(chpt,"%d%d",&m,&n); /* 讀入參數 */
if(m<=0||m>last||n<m) /* 檢查參數合理性 */
{
printf("Error!\n");
return;
}
if(n>last)
n=last; /* 修正參數 */
for(i=m;i<=n;i++) /* 刪除正文 */
free(lineptr[i-1]);
for(i=m,j=n+1;j<=last;i++,j++)
lineptr[i-1]=lineptr[j-1];
last=i-1; /* 修正正文行數 */
modified=1; /* 正文被修改 */
}
void replace()
{
int k,m,n,i,j;
sscanf(chpt,"%d%d%d",&k,&m,&n); /* 讀入參數 */
if(m<=0||m>last||n<m||last-(n-m+1)+k>=MAXLINE)/* 檢查參數合理性 */
{
printf("Error!\n");
return;
}
/* 先完成刪除 */
if(n>last)
n=last; /* 修正參數 */
for(i=m;i<=n;i++) /* 刪除正文 */
free(lineptr[i-1]);
for(i=m,j=n+1;j<=last;i++,j++)
lineptr[i-1]=lineptr[j-1];
last=i-1;
/* 以下完成插入 */
for(i=last;i>=m;i--)
lineptr[i+k-1]=lineptr[i-1];
for(i=0;i<k;i++)
{
fgets(buffer,MAXLEN,stdin);
lineptr[m+i-1]=(char *)malloc(strlen(buffer)+1);
strcpy(lineptr[m+i-1],buffer);
}
last+=k; /* 修正正文行數 */
modified=1; /* 正文被修改 */
}
save(char *fname) /* 保存文件 */
{
int i;
FILE *fp;
if((fp=fopen(fname,"w"))==NULL)
{
fprintf(stderr,"Can't open %s.\n",fname);
exit(1);
}
for(i=0;i<last;i++)
{
fputs(lineptr[i],fp);
free(lineptr[i]);
}
fclose(fp);
}
void edit() /* 編輯命令 */
{
int i;
FILE *fp;
i=sscanf(chpt,"%s",fname); /* 讀入文件名 */
if(i!=1)
{
printf("Enter file name.\n");
scanf("%s",fname);
}
if((fp=fopen(fname,"r"))==NULL) /* 讀打開 */
{
fp=fopen(fname,"w"); /* 如不存在,則創建文件 */
fclose(fp);
fp=fopen(fname,"r"); /* 重新讀打開 */
}
i=0;
while(fgets(buffer,MAXLEN,fp)==buffer)
{
lineptr[i]=(char *)malloc(strlen(buffer)+1);
strcpy(lineptr[i++],buffer);
}
fclose(fp);
last=i;
}
4. 用文本文檔編寫的一個c語言程序應該如何運行
使用C編譯器編譯為可執行文件。
常見的編譯器有MSC、VC、TC、BC、BCB、GCC、GC等等。
C語言是不能解釋運行的,必須先編譯為可執行文件。
不過早前聽說有可解釋運行的C環境,好象還是國產的,可以搜索下。
5. C語言 文本編譯程序怎麼編
??不明白問的問題
6. c語言編程:編一個文本編譯器。(2)
已發給樓主
7. 急求簡單文本編輯器的C語言源代碼,源程序 VC++6.0
我曾經在資源吧看到過,你去找找吧,肯定有。
8. c語言編寫簡易的文本編輯器
我這里有一個功能強大文本編譯器程序的完整c代碼,是外國人寫的。不好意思,很長,發不上來。
不過這里有一個簡易文本編譯器。雖說是簡易,也不是那麼好弄的,給你:
http://..com/question/79338502.html
9. c語言編程:編一個文本編譯器。
樓主,你好!
以前數據結構大作業,寫過一個文本編輯器,命令行下的,還有些印象
基本的打開、保存文件的操作用標准IO庫提供的函數就行了,鍵盤操作當時用的是TC下的bios.h(貌似只有TC下才有),裡面有捕獲鍵盤輸入的函數,如CTRL+s保存文件之類的。查找操作選擇好適合的j數據結構,都有現成的演算法可以使用
下面是我以前用來參考的一個代碼(寫得比較粗糙),你也可以看一下
希望對你能有幫助吧
參考代碼已經發給樓主