2017-06-17 115 views
2

即時通訊設法使一個程序,從文件中讀取單詞,並將每個單詞和它出現的行存儲在一個列表中,然後用字母顯示的行打印單詞,以及如何做到這一點的任何指導? 到目前爲止,我已經把兩個數組,字和行測試我code..but IM混淆如何使它從文件中讀取與得到的每個單詞,它出現在行..如何掃描單詞並存儲從C中掃描的行?

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

#define LEN 7 


/* Struct for word and lines that appears in */ 
struct wordStruct { 
char *word; 
char *lines; 
struct wordStruct *next; 
}; 

static int compare_words(const struct wordStruct *a, const struct wordStruct *b) { 
return strcmp(a->word, b->word); 
} 

static struct wordStruct *insert_sorted(struct wordStruct *headptr, char *word, char *lines) { 
/* Struct head */ 
struct wordStruct **pp = &headptr; 
/* Allocate heap space for a record */ 
struct wordStruct *ptr = malloc(sizeof(struct wordStruct)); 
if (ptr == NULL) { 
    abort(); 
} 

/* Assign to structure fields */ 
ptr->word = word; 
ptr->lines = lines; 
ptr->next = NULL; 

/* Store words in alphabetic order */ 
while (*pp != NULL && compare_words(ptr, *pp) >= 0) { 
    pp = &(*pp)->next; 
} 
ptr->next = *pp; 
*pp = ptr; 

return headptr; 
} 


int main(int argc, char **argv) { 

char *Arr[LEN] = { "jack", "and", "jill", "went", "up", "the", "hill" }; 
char *Arr2[LEN] = { "22,1,5", "24,7,3", "50", "26,66", "18,23", "32,22", "24,8" }; 


int i; 

/* Snitialize empty list */ 
struct wordStruct *headptr = NULL; 
/* Snitialize current */ 
struct wordStruct *current; 

/* Insert words in list */ 
for (i = 0; i < LEN; i++) { 
    headptr = insert_sorted(headptr, Arr[i], Arr2[i]); 
} 

current = headptr; 
while (current != NULL) { 
    printf("%s appears in lines %s.\n", current->word, current->lines); 
    current = current->next; 
} 
return 0; 
} 

我thoguht這個太,但林不知道如何與我的代碼,使它獲得這裏所說的被發現的線,並在wordStruct線的變化進行合併..

void read_words (FILE *f) { 
char x[1024]; 
/* assumes no word exceeds length of 1023 */ 
while (fscanf(f, " %1023s", x) == 1) { 
    puts(x); 
} 
} 
+0

事情是線的長度是在我的情況未知.. – AdmDTR

+0

順便說一句:在'的fscanf無需在格式空間(F, 「%1023S」,x)的'as''%s「'跳過前導空格。 – chux

+0

歡迎使用堆棧溢出。 請注意,在這裏說'謝謝'的首選方式是通過 提高投票的好問題和有用的答案(一旦你有足夠的聲譽這樣做),並接受任何 問題最有用的答案,你問(這也給你一個小小的提升,以你的聲望 )。 請參閱[關於]頁面,以及[如何在此處提問 ?]和 [當有人回答我的 問題時,我該怎麼辦? ?](http://stackoverflow.com/help/someone-answers) –

回答

1

IM困惑以及如何使其從文件中讀取,並獲取每個單詞和它出現的行。

讓我們定義一條:所有字符的最大和最終包括一個潛在的終止'\n'。第一行是line 1.最後一行可能會或可能不會以'\n'結尾。

讓我們定義一個:A 字符串由非空白字符組成。出於實際和安全考慮,請限制其大小。

使用fscanf(..., "%1023s", ...)工作讀取單詞,但由於"%s"消耗前導空格,因此計數行的任何'\n'都會丟失。只需預先fscanf,一次一個角色尋找'\n'

char *GetWord1024(FILE *ifile, char *dest, uintmax_t *linefeed_count) { 
    // test for bad parameters 
    assert(ifile && dest && linefeed_count); 

    // consume leading white space and update count of leading line-feeds 
    int ch; 
    while (isspace(ch = fgetc(ifile))) { 
    if (ch == '\n') { 
     (*linefeed_count)++; 
    } 
    } 
    ungetc(ch, ifile); // put back non-whitespace character or EOF 

    if (fscanf(ifile, "%1023s", dest) == 1) { 
    return dest; 
    } 

    return NULL; // No word 
} 

示例用法

int main(void) { 
    uintmax_t linefeed_count = 0; 
    char word[1024]; 
    while (GetWord1024(stdin, word, &linefeed_count)) { 
    printf("Line:%ju <%s>\n", linefeed_count + 1, word); 
    } 
    return 0; 
} 
+0

以及如果例如我想忽略所有非字母/數字字符?像「下山」將被視爲2個詞,「下」和「山」? – AdmDTR

+0

@AdmDTR研究'isalnum()'。然而[那](https://stackoverflow.com/questions/44604438/how-to-scan-words-and-store-which-line-scanned-from-in-c/44607869?noredirect=1#comment76205105_44607869)是另一個問題。建議另一個帖子。 – chux

+0

明白了,謝謝!還有一件事,如何設置當我運行我的代碼時創建的文件的名稱?例如,如果我在文件「text.txt」上運行它,那麼輸出將會在一個帶有相同名稱的文件中添加一個「.something」,因此它會是「text.txt.something」? – AdmDTR