2016-03-17 84 views
-5

我想出了一個想法來提高我的詞彙量。這個想法是在文件中有大量最常見的英語單詞。 然後,我會編寫一個程序,一次顯示屏幕上的文字。如果我認出這個詞,我按DOWN鍵 移動到下一個單詞,否則我按'S'將這個單詞保存到名爲Unknown.txt的文本文件。以編程方式查找單詞含義並將其打印到文件

當我完成後,我將收集所有我不知道他們的意思的單詞。如果我在這裏停下來,並手動通過每個詞 並與我的詞典查找它的意義,它將需要很多時間學習他們這一切。

但是,如果我有一種方法來以編程方式保存單詞的含義,我可以很容易地打開該文件,並立即學習單詞的含義。這就是我想要的。

的 「10kword.txt」 文件如下所示:

購買
客戶
活躍
響應
實踐
硬件。

這裏是我的代碼至今:

#include <stdio.h> 
#include <Windows.h> 

void cls(void *hConsole); 

int main(void) 
{ 
    FILE *inp, *out; 
    if (fopen_s(&inp, "10kWords.txt", "r")) { 
     fprintf(stderr, "Unable to open input file\n"); 
     return 1; 
    } 
    else if (fopen_s(&out, "Unknown.txt", "a")) { 
     fprintf(stderr, "Error opening file Unknown.txt\n"); 
     fclose(inp); 
     return 1; 
    } 
    char buf[100]; 
    void *hConsole = GetStdHandle(STD_OUTPUT_HANDLE); 

    while (1) { 
     //Press the down key to move to the next word 
     if (GetAsyncKeyState(VK_DOWN) == -32767) { 
      cls(hConsole); 
      fscanf_s(inp, "%s", buf, 100); 
      printf("%s", buf); 
     } 
     //Press S to save the word to output file 
     else if (GetAsyncKeyState('S') == -32767) { 
      fprintf(out, "%s\n", buf); 
      //Obtain word meaning from dictionary Programatically HERE and print it to 'out' 
     } 
     else if (GetAsyncKeyState(VK_ESCAPE)) { 
      break; 
     } 
    } 
    fclose(inp); 
    fclose(out); 
    return 0; 
} 

void cls(void *hConsole) 
{ 
    COORD coordScreen = { 0, 0 }; // home for the cursor 
    DWORD cCharsWritten; 
    CONSOLE_SCREEN_BUFFER_INFO csbi; 
    DWORD dwConSize; 
    // Get the number of character cells in the current buffer. 
    if (!GetConsoleScreenBufferInfo(hConsole, &csbi)) 
    { 
     return; 
    } 
    dwConSize = csbi.dwSize.X * csbi.dwSize.Y; 
    // Fill the entire screen with blanks. 
    if (!FillConsoleOutputCharacter(hConsole,  // Handle to console screen buffer 
     (TCHAR) ' ',  // Character to write to the buffer 
     dwConSize,  // Number of cells to write 
     coordScreen,  // Coordinates of first cell 
     &cCharsWritten))// Receive number of characters written 
    { 
     return; 
    } 
    // Get the current text attribute. 
    if (!GetConsoleScreenBufferInfo(hConsole, &csbi)) 
    { 
     return; 
    } 
    // Set the buffer's attributes accordingly. 
    if (!FillConsoleOutputAttribute(hConsole,   // Handle to console screen buffer 
     csbi.wAttributes, // Character attributes to use 
     dwConSize,  // Number of cells to set attribute 
     coordScreen,  // Coordinates of first cell 
     &cCharsWritten)) // Receive number of characters written 
    { 
     return; 
    } 
    // Put the cursor at its home coordinates. 
    SetConsoleCursorPosition(hConsole, coordScreen); 
} 
+2

與您的問題無關,但不要使用帶前導下劃線的符號名稱,後跟大寫字母(如變量_Buf)。這些名稱保留給「實現」(即編譯器和標準庫)。也不要使用[magic numbers](https://en.wikipedia.org/wiki/Magic_number_%28programming%29),例如'-32767'。如果你想檢查一個特定的位或位使用位運算符。 –

+0

我在第22行得到這個警告; 'main.cpp(22):警告C4473:'fscanf_s':沒有足夠的參數傳遞格式字符串。 –

+0

@MichaelWalz,實際上我使用了fscanf,但編譯器拒絕編譯代碼,並提出'fscan_s',所以我使用它,並編譯了警告,我忽略了它。 –

回答

1

它好像你正在尋找的是一個字典的API,你可以發送一個請求到服務器,並得到迴應。快速google search顯示有相當多的。除此之外,您還需要一些額外的C庫來製作HTTP請求(例如libcurl),以及一種解析JSON或XML的方法。您可以使用this other stack overflow question來舉例說明如何使用它,然後您可以使用它它發送請求給Merriam的API。

Here's another good API

這絕對是一個開放式問題,但希望我指出你在正確的方向。

下面是一些示例代碼from the curl website展示瞭如何使用捲髮做一個GET HTTP請求:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

#include <curl/curl.h> 

struct MemoryStruct { 
    char *memory; 
    size_t size; 
}; 

static size_t 
WriteMemoryCallback(void *contents, size_t size, size_t nmemb, void *userp) 
{ 
    size_t realsize = size * nmemb; 
    struct MemoryStruct *mem = (struct MemoryStruct *)userp; 

    mem->memory = realloc(mem->memory, mem->size + realsize + 1); 
    if(mem->memory == NULL) { 
    /* out of memory! */ 
    printf("not enough memory (realloc returned NULL)\n"); 
    return 0; 
    } 

    memcpy(&(mem->memory[mem->size]), contents, realsize); 
    mem->size += realsize; 
    mem->memory[mem->size] = 0; 

    return realsize; 
} 

int main(void) 
{ 
    CURL *curl_handle; 
    CURLcode res; 

    struct MemoryStruct chunk; 

    chunk.memory = malloc(1); /* will be grown as needed by the realloc above */ 
    chunk.size = 0; /* no data at this point */ 

    curl_global_init(CURL_GLOBAL_ALL); 

    /* init the curl session */ 
    curl_handle = curl_easy_init(); 

    /* specify URL to get */ 
    curl_easy_setopt(curl_handle, CURLOPT_URL, "http://www.dictionaryapi.com/api/v1/references/collegiate/xml/overflow?key=<YOUR KEY GOES HERE>"); 

    /* send all data to this function */ 
    curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, WriteMemoryCallback); 

    /* we pass our 'chunk' struct to the callback function */ 
    curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, (void *)&chunk); 

    /* some servers don't like requests that are made without a user-agent 
    field, so we provide one */ 
    curl_easy_setopt(curl_handle, CURLOPT_USERAGENT, "libcurl-agent/1.0"); 

    /* get it! */ 
    res = curl_easy_perform(curl_handle); 

    /* check for errors */ 
    if(res != CURLE_OK) { 
    fprintf(stderr, "curl_easy_perform() failed: %s\n", 
      curl_easy_strerror(res)); 
    } 
    else { 
    /* 
    * Now, our chunk.memory points to a memory block that is chunk.size 
    * bytes big and contains the remote file. 
    * 
    * Do something nice with it! 
    */ 

    printf("%lu bytes retrieved\n", (long)chunk.size); 
    } 

    /* cleanup curl stuff */ 
    curl_easy_cleanup(curl_handle); 

    free(chunk.memory); 

    /* we're done with libcurl, so clean it up */ 
    curl_global_cleanup(); 

    return 0; 
} 

這個例子然後打印溢出的定義爲一個XML文件到內存。

祝你好運!

+0

你不覺得這是C++? –

+0

哎呦我把標籤弄錯了。給我幾分鐘,我會更新我的答案C – Tmayto

+0

你走了。對不起,等待,我忘了評論它已更新。祝你好運 – Tmayto

0

程序中有一個錯誤:您錯誤地使用了fscanf_s。您應該將目標緩衝區的大小作爲rsize_tsize_t傳遞,而不是int。有一個很好的機會intsize_t在您的系統上沒有相同的大小,所以你調用未定義的行爲。修復代碼是這樣的:

fscanf_s(inp, "%s", buf, (size_t)100); 

您還應該檢查的fscanf_s的返回值,以驗證它確實解析輸入文件中的一句話。您可能還需要指定最大字符數以掃描某個詞,以避免fscanf_s默認行爲,如果輸入的詞太長,將會終止程序。做到這一點:

fscanf_s(inp, "%99s", buf, (size_t)100); 
+0

謝謝你的寶貴編程意見,但是如何回答我的問題? –

+1

@ machine_1:實際上,我並沒有在你的文章中看到一個問題......我指出了代碼中的一些錯誤,可以解釋一些問題......你究竟在問什麼? – chqrlie

+0

我如何通過編程獲得單詞的含義。那是我的問題。 –

相關問題