2015-08-30 115 views
-1

我有一個帶有一些電話號碼和女主角的文檔。 我現在嘗試將結構和地址的一部分中的數字複製到另一部分中。 目前,我只是能夠得到文件的數據,但我不能把它放在我的結構,請幫我如何在C中剪切字符串

C代碼

#define _CRT_SECURE_NO_WARNINGS 
#include <stdio.h> 
#include <string.h> 

struct telefon{ 
    char nummer[16]; 
    char adresse[128]; 
}; 

typedef struct telefon TELEFON; 

void main() 
{ 
    TELEFON tel; 
    char buffer[256]; 
    FILE *fp; 
    int i = 0; 
    int countSemi = 0; 

    fp = fopen("Telefondatei.txt", "r"); 

    if(fp == NULL) 
    { 
     printf("Datei konnte nicht geoeffnet werden.\n"); 
    } 
    else{ 

     while(fgets(buffer,1000,fp) != 0){ 
      //printf("%s\n",buffer); 
      while(buffer != 0){ 
       i++; 
       if(buffer[i] == ';'){ 
        countSemi++; 
       } 
       while(countSemi <= 7){ 
        strcpy(tel.adresse,buffer); 
        printf("%s\n %d \n",tel.adresse,countSemi); 
       } 
      } 
     } 
    } 
} 

的數據比如我的.txt文件

「豐資本」; 「」; 「汽車有限公司」; 「gasse 3」, 「5000」, 「星期一」, 「」, 「0456」, 「45652」 「豐資本」; 「」;」 ADAC「;」「;」50000「;」Mon「;」「; 2156」;「545218」

+3

1)如果緩衝區爲256個字節,你爲什麼要在'與fgets讀1000( )'? 2)爲什麼緩衝區在下面的'while'循環中應該變爲NULL? - 最終你想再讀一遍'fgets()'的文檔? –

+0

你完全是1000字節,只是無用的。 我的老師在文檔結束時向我們解釋了fgets返回null – alovaros

+0

您的分號分隔值文件中的哪些字段對應於電話號碼以及哪個地址對應?你期望在地址的各個部分之間保留分號嗎?如果不是,你想要什麼 - 換行符,空格,還有其他的東西?請注意,'main()'通常應該返回一個'int' - 參見[main()應該在C和C++中返回什麼?](http://stackoverflow.com/questions/204476/what-should-main- return-in-c-and-c/18721336#18721336)瞭解詳情。 –

回答

1

您需要另外使用strtok。看到這個例子。但是,請注意,此示例假設數據是以固定格式編寫的(並且如果數據以其他格式發送,則不起作用 - 您可能需要對此進行修改以滿足您的需要,這僅僅是舉例說明):

假定的數據格式對於每一行:

Address; telephoneNumber;

#include <string.h> 
.. 
char * value; 
while(fgets(buffer,256,fp) != 0) 
{ 
    value = strtok(buffer, ";"); // get address 
    strcpy(tel.adresse, value); 

    value = strtok(NULL, ";"); // get number 
    strcpy(tel.nummer, value); 

} 

而且這樣的:

while(buffer != 0) 
在你的代碼

沒有意義。幾乎buffer將是0.它是陣列和值buffer將始終是陣列啓動的內存地址。您不能分配到buffer

這是另一個post關於使用strtok

+0

嗯,這是一個很好的第一部分,但我不能改變格式:D,如果我們只是會有地址和數字,它會很容易 – alovaros

+0

@alovaros:也許你可以將這種方法應用於你的情況。 –

+0

你假設的格式看起來有點奇特。對於示例數據,任何一行都沒有電話號碼。當然,我們還沒有被告知電話號碼在哪裏。如果我不得不猜測,那是最後兩列。但我們不知道。 –

-2

爲了讓您的數據使用:fscanf(fp, "%s %s %s %d", str1, str2, str3, &number); 或者您可以使用getc得到一個字符但你需要測試EOF

+0

這將如何幫助?第一條數據行會填充'str1'和'str2',而其他的則不設置。在第二行數據中,'str2'也不會被設置。 –

+0

不,只是把它放在一個循環中,光標將在下一行數據 – cip

+0

對不起,但這簡直是無稽之談。我的MCVE:'#include '和'int main(void){FILE * fp = stdin; char str1 [80]; char str2 [80]; char str3 [80]; int數字; int line = 0; int rc; while((rc = fscanf(fp,「%s%s%s%d」,str1,str2,str3,&number))> 0){printf(「Line%d:fields =%d \ n」,++ line,rc); if(rc> = 1)printf(「str1 = [[%s]] \ n」,str1); if(rc> = 2)printf(「str2 = [[%s]] \ n」,str2);如果(rc> = 3)printf(「str3 = [[%s]] \ n」,str3); if(rc> = 4)printf(「number = [[%d]] \ n」,number); } return 0; }'分佈在我的代碼中的29行。 –