簡體   English   中英

解析文件txt C

[英]Parsing file txt C

伙計們,我在代碼的這一部分:

void token(){
FILE *pointer;
user record;
pointer = fopen("utente_da_file.txt","r+");
printf("OK");   
fscanf(pointer , "%s, %s, %s, %s, %s \n" , record.nome_utente , record.nome , record.cognome , record.data_di_nascita , record.data_di_iscrizione);
fclose(pointer);
printf("TEXT -> %s \n" , record.nome_utente);
}

這是utente_da_file.txt

cocco,ananas,banana,ciao,miao 

這是我的輸出:

TEXT -> cocco,ananas,banana,ciao,miao 

我不明白為什么。 問候 :)

這是由於scanf系列中%s參數的性質所致:它消耗所有字符,直到遇到的第一個空格字符–或直到輸入結束,以先到者為准( scanf -OK,C ++文檔,但適用於C一樣)。 由於您的文件中沒有空格,因此可以立即使用整個內容(包括逗號),然后再以格式字符串對其進行掃描...

如果您檢查了(f)scanf的返回值,您將得到提示-它返回填充的變量數,因此您應該以1作為返回值。

(f)scanf系列的問題是,您無法指定分隔符來停止字符串。 因此,在您的情況下,您將不得不在文件的單詞之間添加空格。 但要注意,逗號將字符串的一部分,那么,如果你他們之后追加的空白,你就必須追加空格之前 ,使您的格式字符串可以使用它們-這可能使你的文件難看,雖然如此,你可能更喜歡然后將其完全刪除(但也將它們放在格式字符串中!)。

另外,您可以使用fgets一次讀取整行,然后使用strtok對其進行解析。 整個過程可能類似於以下代碼:

char buffer[256];
fgets(buffer, sizeof(buffer), pointer);
char const* delimiters = ", \t\n\r";
char* token = strtok(buffer, delimiters);
if(token)
{
    strncpy(record.nome_utente, token, sizeof(record.nome_utente));
    if((token = strtok(NULL, delimiters)))
    {
        strncpy(record.nome, token, sizeof(record.nome));
        // rest alike...
    }
}

對我而言,最好的解決方案是以這種方式編寫thr C代碼(2%s之間的空格):

fscanf(pointer , "%s %s %s %s %s \n" , record.nome_utente , record.nome , record.cognome , record.data_di_nascita , record.data_di_iscrizione);

並以這種方式寫入文本文件(兩個記錄之間的空格):

cocco ananas banana ciao miao

通過這種方式,我確定它會很好地工作。 Ciao e buona fortuna。

暫無
暫無

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

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