Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • World
  • Users
  • Groups
Skins
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Code Project
  1. Home
  2. General Programming
  3. C / C++ / MFC
  4. save file error!

save file error!

Scheduled Pinned Locked Moved C / C++ / MFC
debugginghelpquestion
9 Posts 3 Posters 0 Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • W Offline
    W Offline
    wbgxx
    wrote on last edited by
    #1

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

    #define STOP 0
    #define TRUE 1
    #define OK 1
    #define FILE_NAME ("my.text")

    typedef struct List
    {
    long lNum;
    char cpsName[30];
    long lCScore;
    long lMathScore;
    long atol(long i);
    struct List *next;
    }Stu;

    Stu stuList[3] =
    {
    {1, "asd", 32, 44, 0},
    {2, "ffg", 66, 66, 0},
    {3, "dgd", 55, 44, 0},
    };

    Stu *CreateList()
    {
    Stu *head = NULL;
    Stu *NewNode = NULL;
    int i = 0;

    for (i=0; i<3; i++)
    {
    	NewNode = (Stu\*)malloc(sizeof(Stu));
    
    	NewNode->lNum = stuList\[i\].atol(stuList\[i\].lNum);
    	strncpy(NewNode->cpsName, stuList\[i\].cpsName, 30);
    	NewNode->lCScore = stuList\[i\].atol(stuList\[i\].lCScore);
    	NewNode->lMathScore = stuList\[i\].atol(stuList\[i\].lMathScore);
    	NewNode->next = NULL;
    
    	if (NULL == head)
    	{
    		head = NewNode;
    	}
    	else
    	{
    		head->next = NewNode;
    		head = NewNode;
    	}
    }
    
    return head;	
    

    }

    int SaveToFiles(Stu *head)
    {
    Stu *p = head;
    FILE *fp;
    char cFileName[1024] = {0};
    //strcpy(cFileName, FILE_NAME);

    if ((fp = fopen(FILE\_NAME, "wb")) == NULL)
    {
    	printf( "Open file error!\\n" );
    	exit (1);
    }
    
    while (p != NULL)
    {
    	if (fwrite(p, sizeof(Stu), 1, fp) == 1)
    	{
    		p = p->next;
    	}
    	else
    	{
    		printf("Write file error!\\n");
    		exit(1);
    	}
    
    }
    fclose(fp);
    
    printf( "Save file succeed!\\n" );
    return OK;
    

    }

    int OpenFiles()
    {

    char cFileName\[256\] = {0};
    FILE \*fp;
    if (0 == (fp = fopen(FILE\_NAME, "r")))
    {
    	printf("Open file error!\\n");
    	exit(0);
    }
    
    fgets(cFileName, 250, fp);
    printf("%s", cFileName);
    fclose(fp);
    return OK;
    

    }

    int main()
    {
    Stu *head = NULL;

    head = CreateList();
    SaveToFiles(head);
    OpenFiles();
    //Print(head);
    
    return 0;
    

    }

    this is the error information: error LNK2001: unresolved external symbol "public: long __thiscall List::atol(long)" (?atol@List@@QAEJJ@Z) Debug/file.exe : fatal error LNK1120: 1 unresolved externals Error executing link.exe.

    L 1 Reply Last reply
    0
    • W wbgxx

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

      #define STOP 0
      #define TRUE 1
      #define OK 1
      #define FILE_NAME ("my.text")

      typedef struct List
      {
      long lNum;
      char cpsName[30];
      long lCScore;
      long lMathScore;
      long atol(long i);
      struct List *next;
      }Stu;

      Stu stuList[3] =
      {
      {1, "asd", 32, 44, 0},
      {2, "ffg", 66, 66, 0},
      {3, "dgd", 55, 44, 0},
      };

      Stu *CreateList()
      {
      Stu *head = NULL;
      Stu *NewNode = NULL;
      int i = 0;

      for (i=0; i<3; i++)
      {
      	NewNode = (Stu\*)malloc(sizeof(Stu));
      
      	NewNode->lNum = stuList\[i\].atol(stuList\[i\].lNum);
      	strncpy(NewNode->cpsName, stuList\[i\].cpsName, 30);
      	NewNode->lCScore = stuList\[i\].atol(stuList\[i\].lCScore);
      	NewNode->lMathScore = stuList\[i\].atol(stuList\[i\].lMathScore);
      	NewNode->next = NULL;
      
      	if (NULL == head)
      	{
      		head = NewNode;
      	}
      	else
      	{
      		head->next = NewNode;
      		head = NewNode;
      	}
      }
      
      return head;	
      

      }

      int SaveToFiles(Stu *head)
      {
      Stu *p = head;
      FILE *fp;
      char cFileName[1024] = {0};
      //strcpy(cFileName, FILE_NAME);

      if ((fp = fopen(FILE\_NAME, "wb")) == NULL)
      {
      	printf( "Open file error!\\n" );
      	exit (1);
      }
      
      while (p != NULL)
      {
      	if (fwrite(p, sizeof(Stu), 1, fp) == 1)
      	{
      		p = p->next;
      	}
      	else
      	{
      		printf("Write file error!\\n");
      		exit(1);
      	}
      
      }
      fclose(fp);
      
      printf( "Save file succeed!\\n" );
      return OK;
      

      }

      int OpenFiles()
      {

      char cFileName\[256\] = {0};
      FILE \*fp;
      if (0 == (fp = fopen(FILE\_NAME, "r")))
      {
      	printf("Open file error!\\n");
      	exit(0);
      }
      
      fgets(cFileName, 250, fp);
      printf("%s", cFileName);
      fclose(fp);
      return OK;
      

      }

      int main()
      {
      Stu *head = NULL;

      head = CreateList();
      SaveToFiles(head);
      OpenFiles();
      //Print(head);
      
      return 0;
      

      }

      this is the error information: error LNK2001: unresolved external symbol "public: long __thiscall List::atol(long)" (?atol@List@@QAEJJ@Z) Debug/file.exe : fatal error LNK1120: 1 unresolved externals Error executing link.exe.

      L Offline
      L Offline
      Lost User
      wrote on last edited by
      #2

      Firstly, do not repost the question, but edit the original. As to the error you get the statement long atol(long i); in your structure is not defined anywhere. You cannot declare a method in a structure without implementing it. You should add your own atol() method, or simply call the default library function. Also as I stated earlier your CreateList() function also has a problem.

      MVP 2010 - are they mad?

      W 1 Reply Last reply
      0
      • L Lost User

        Firstly, do not repost the question, but edit the original. As to the error you get the statement long atol(long i); in your structure is not defined anywhere. You cannot declare a method in a structure without implementing it. You should add your own atol() method, or simply call the default library function. Also as I stated earlier your CreateList() function also has a problem.

        MVP 2010 - are they mad?

        W Offline
        W Offline
        wbgxx
        wrote on last edited by
        #3

        Yeah! fist, Createlist()function has a problem ?why?could you give me a detail! second, I know atol()is libiary but if I use like this it also has a problem,why? thank you for your reply!

        L enhzflepE 2 Replies Last reply
        0
        • W wbgxx

          Yeah! fist, Createlist()function has a problem ?why?could you give me a detail! second, I know atol()is libiary but if I use like this it also has a problem,why? thank you for your reply!

          L Offline
          L Offline
          Lost User
          wrote on last edited by
          #4

          wbgxx wrote:

          I know atol()is libiary but if I use like this it also has a problem,why?

          Sentences like this are rising to the top of the list of most useless statements. If your program does not work in some way, saying "it has a problem", gives us no information to guess what may be wrong. Please try and explain what happens; do you get a compiler error, does it cause an exception, does it return the wrong result, etc? However, having looked at the code again I see:

          NewNode->lNum = stuList[i].atol(stuList[i].lNum);

          OK, so let's correct it

          NewNode->lNum = atol(stuList[i].lNum);

          The atol() function takes a string of digits as input and returns its value as a long variable. Your statement is trying to pass a long as its input parameter which a) is wrong, and b) makes no sense; the value is already a long. The other problem with Createlist() is that it returns the pointer to the last structure in your list rather than the first; you need to keep a copy of the first entry added to the head pointer.

          MVP 2010 - are they mad?

          W 1 Reply Last reply
          0
          • W wbgxx

            Yeah! fist, Createlist()function has a problem ?why?could you give me a detail! second, I know atol()is libiary but if I use like this it also has a problem,why? thank you for your reply!

            enhzflepE Offline
            enhzflepE Offline
            enhzflep
            wrote on last edited by
            #5

            (2) Simple - if atol is a library function then use it as such!! ;P declare your struct like this:

            typedef struct List
            {
            long lNum;
            char cpsName[30];
            long lCScore;
            long lMathScore;
            struct List *next;
            }Stu;

            And use the function like this:

            NewNode->lCScore = stuList[i].atol(stuList[i].lCScore);
            NewNode->lCScore = atol(stuList[i].lCScore);

            L 1 Reply Last reply
            0
            • L Lost User

              wbgxx wrote:

              I know atol()is libiary but if I use like this it also has a problem,why?

              Sentences like this are rising to the top of the list of most useless statements. If your program does not work in some way, saying "it has a problem", gives us no information to guess what may be wrong. Please try and explain what happens; do you get a compiler error, does it cause an exception, does it return the wrong result, etc? However, having looked at the code again I see:

              NewNode->lNum = stuList[i].atol(stuList[i].lNum);

              OK, so let's correct it

              NewNode->lNum = atol(stuList[i].lNum);

              The atol() function takes a string of digits as input and returns its value as a long variable. Your statement is trying to pass a long as its input parameter which a) is wrong, and b) makes no sense; the value is already a long. The other problem with Createlist() is that it returns the pointer to the last structure in your list rather than the first; you need to keep a copy of the first entry added to the head pointer.

              MVP 2010 - are they mad?

              W Offline
              W Offline
              wbgxx
              wrote on last edited by
              #6

              Oh!Yes,I see! very grateful for you !

              1 Reply Last reply
              0
              • enhzflepE enhzflep

                (2) Simple - if atol is a library function then use it as such!! ;P declare your struct like this:

                typedef struct List
                {
                long lNum;
                char cpsName[30];
                long lCScore;
                long lMathScore;
                struct List *next;
                }Stu;

                And use the function like this:

                NewNode->lCScore = stuList[i].atol(stuList[i].lCScore);
                NewNode->lCScore = atol(stuList[i].lCScore);

                L Offline
                L Offline
                Lost User
                wrote on last edited by
                #7

                enhzflep wrote:

                NewNode->lCScore = atol(stuList[i].lCScore);

                Except that stuList[i].lCScore is already a long; as I pointed out in my previous message.

                MVP 2010 - are they mad?

                enhzflepE 1 Reply Last reply
                0
                • L Lost User

                  enhzflep wrote:

                  NewNode->lCScore = atol(stuList[i].lCScore);

                  Except that stuList[i].lCScore is already a long; as I pointed out in my previous message.

                  MVP 2010 - are they mad?

                  enhzflepE Offline
                  enhzflepE Offline
                  enhzflep
                  wrote on last edited by
                  #8

                  Yes indeed. :-O :-O

                  L 1 Reply Last reply
                  0
                  • enhzflepE enhzflep

                    Yes indeed. :-O :-O

                    L Offline
                    L Offline
                    Lost User
                    wrote on last edited by
                    #9

                    Wish I had a £1 for every time I've done something similar :((

                    MVP 2010 - are they mad?

                    1 Reply Last reply
                    0
                    Reply
                    • Reply as topic
                    Log in to reply
                    • Oldest to Newest
                    • Newest to Oldest
                    • Most Votes


                    • Login

                    • Don't have an account? Register

                    • Login or register to search.
                    • First post
                      Last post
                    0
                    • Categories
                    • Recent
                    • Tags
                    • Popular
                    • World
                    • Users
                    • Groups