簡體   English   中英

隨機排序讀取文件

[英]Read file with random ordering

我需要讀取一個具有ASCII字符隨機順序的文件,並根據我得到的任何字符來執行某些操作。 我可以獲取任何這些字符類型“ /”,“ *”,字符串或數字。 對於每種情況,我需要做一些不同的事情。 我認為最好的方法是從fgets開始並逐行閱讀。 之后,我通常會使用sscanf,但是由於要讀取的文件具有ASCII字符的隨機順序,因此我不確定如何執行此操作。 這就是我開始的。 任何想法將不勝感激。

while(fgets(buffer, 80, fp) != NULL)
{
    /*if(/)
    {
        //do something for "/" character
    }
    if(*)
    {
        //do something for "*" character
    }
    if(string)
    {
        //do something for string
    }
    if(numbers)
    {
        //do something for numbers
    }*/
    memset(buffer, 0, 80);
}

像這樣的例子:

while(fgets(buffer, 80, fp) != NULL)
{
    char ch, cx = 0;
    double n;

    if(sscanf(buffer, "%c %c", &ch, &cx) == 1){
        if(ch == '/'){
            puts("/");
        } else if(ch == '*'){
            puts("*");
        }
    } else if(sscanf(buffer, "%lf %c", &n, &cx) == 1){
        puts("number");
    } else {//Check further limiting condition?
        puts("string");
    }
    memset(buffer, 0, 80);
}

您的想法正確。 解決所有這些類型問題的關鍵是,就像您所做的那樣,將行讀入緩沖區。 然后,您必須弄清楚緩沖區中的內容。 通常,大多數決定都可以對緩沖區中的第一個字符(例如+,-,/,*,... )進行。

在其他情況下,通過初始測試后,您將需要進一步處理該行(例如isdigit()isalpha() (可以簡化為簡單字符比較以避免函數調用))。

處理這兩種情況的簡單方法是,簡單地將一個指針分配給緩沖區,然后使用該指針遍歷緩沖區以測試,提取或傳遞所需的元素到處理函數。

現在,下一個挑戰是循環控制。 有些測試需要整個字符串,有些則可能只關心第一個char 類似於以下內容的方法將使您能夠以優美的方式處理任何行以獲取所需的信息:

while(fgets(buffer, 80, fp) != NULL)
{
    char *p = buffer;
    while (*p)
    {
        if(/)
        {
            //do something for "/" character
        }
        if(*)
        {
            //do something for "*" character
        }
        if(('A' <= *p && *p <= 'Z') || ('a' <= *p && *p <= 'z'))
        {
            // do something for string
            // handle initial char
            while (*p) {
                // handle rest of string;
                p++;
            }
            if (!*p)
                goto nextline;
        }
        if('1' <= *p && '9' <= *p)
        {
            // do something for numbers
            convert numbers with atoi() or strtol(), ....
            if (endofline)
                goto nextline;
        }
        p++;
    }
    nextline:;
    //memset(buffer, 0, 80); /* not needed */
}

除了揮舞死貓,還有更多不同的方式可以做到這一點。 由您選擇適合您數據的程序控制方法。 如果您有任何問題,請告訴我。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM