2016-09-15 20 views
0
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

#define  ZERO   (0) 
#define  ONE   (1) 
#define  TEN   (10) 
#define TWENTY   (20) 
#define FOURTY_SEVEN  (47) 
#define FIFTY_SEVEN  (57) 

typedef struct PHONE 
{ 
char szName[20] ; 

char szPhone[20] ; 

struct PHONE *pNext ; 
}; 

struct PHONE *pFirst    = NULL ; // To denote start of the linked list 

struct PHONE *pPointer   = NULL ; // To denote current end node in linked list 

struct PHONE *pNew    = NULL ; // To denote the new node 

struct PHONE *pTemp    = NULL ; // To store pointer temporarily 

struct PHONE *pTempForDeallocation = NULL ; // To store pointer for deallocation 

struct PHONE stPhone   ; 

FILE *fPointerForOpen    ;   // To Open the file 

int FilePresentOrNot()   ;   // To Check the file is present or not 

int MemoryAllocation()   ;   // To Allocate Memory to the Linked List 

int main() 
{ 
    int iChoice  = 0 ; 

    int iRepeat  = 0 ; 

    int iLength  = 0 ; 

    do 
    { 
    fPointerForOpen = fopen("phonebook.txt","r"); 

    fflush(stdin); 

    system("cls"); 

    if(NULL == fPointerForOpen) 
    { 
     FilePresentOrNot(); 
    } 

    // stPhone.szName = (char *)malloc(100); 

    while(fscanf(fPointerForOpen,"%s",stPhone.szName)!= EOF) 
    { 
     fscanf(fPointerForOpen,"%s",stPhone.szPhone); 

     pNew = (struct PHONE *) malloc(sizeof(struct PHONE)) ; 

     strcpy(pNew -> szName , stPhone.szName) ; 

     strcpy(pNew -> szPhone , stPhone.szPhone) ; 

     pNew ->pNext = NULL ; 

     MemoryAllocation() ; 
    } 
    printf("\n\nDo you Want to continue then press 1 ? \t"); 

    scanf("%d",&iRepeat); 

    fclose(fPointerForOpen); 

    pFirst = NULL ; 

}while(ONE == iRepeat); 
return 0 ; 
} 


int MemoryAllocation() 
{ 
if(NULL == pFirst) 
    { 
    pFirst = pNew ; 

    pPointer = pNew ; 

} 
else 
    { 
    pPointer->pNext = pNew ; 

    pPointer  = pNew ; 

} 
} 

ここにコードがあります。ここでは配列を使用して名前と電話番号を読み込み、その配列をポインタに置き換えます。私が交換した時、私は4文字だけを読むことができます。文字配列を使用せずにファイルから文字列を読み取る方法は?

誰も私にそれをするのに役立ちますし、それが正しいかどうか教えてください?

+1

Em ...ヌル文字で終わる配列である文字列を保存する場合は、何らかの形で配列が必要です。 –

+1

ポインタが何かを指しています。それらを 'char *'にすることはできますが、そのバッファにデータを格納したい場合は、配列を何らかの方法で割り当てる必要があります。この場合、リソースの意味は実際には分かりません。固定サイズの構造では、読み書きが可能なので、すべての作業がずっと簡単になります。 – Havenard

答えて

1

構造体をこれに置き換えます。

typedef struct PHONE 
    { 
     char *szName ; 
     char *szPhone ; 
     struct PHONE *pNext ; 
    }; 

次に、PHONEの新しいインスタンスを使用するたびに、必要なメモリを割り当てます。

aPhone.szName = (char *)malloc(sizeOfNameBuffers); 

又は pNew-> szName =(CHAR *)のmalloc(sizeOfNameBuffers)。

1

ファイルの開閉は継続します。ファイルを開くたびに、カーソルはファイルの先頭に移動し、1行目を何度も繰り返し読み始めます。代わりに次の例を試してみてください。

struct PHONE 
{ 
    char szName[20]; 
    char szPhone[20]; 
    struct PHONE *pNext; 
}; 

int main() 
{ 
    FILE *fPointerForOpen; 
    struct PHONE *pFirst = NULL; // To denote start of the linked list 
    struct PHONE *pPointer = NULL; // To denote current end node in linked list 
    struct PHONE *pNew = NULL; // To denote the new node 
    struct PHONE stPhone; 

    fPointerForOpen = fopen("phonebook.txt", "r"); 
    if (!fPointerForOpen) 
    { 
     printf("cannot read file\n"); 
     return 0; 
    } 

    while(fscanf(fPointerForOpen, "%s %s", stPhone.szName, stPhone.szPhone) == 2) 
    { 
     pNew = (struct PHONE*)malloc(sizeof(struct PHONE)); 
     strcpy(pNew->szName, stPhone.szName); 
     strcpy(pNew->szPhone, stPhone.szPhone); 
     pNew->pNext = NULL; 

     if (!pFirst) 
      pFirst = pNew; 
     else 
      pPointer->pNext = pNew; 

     pPointer = pNew; 
    } 

    fclose(fPointerForOpen); 

    //print the list: 
    pPointer = pFirst; 
    printf("Testing:\n"); 
    while (pPointer) 
    { 
     printf("%s %s\n", pPointer->szName, pPointer->szPhone); 
     pPointer = pPointer->pNext; 
    } 

    return 0; 
} 

また、不要なときにグローバル変数を使用しないようにしてください。上記の例のように変数をスタックに入れてください。

関連する問題