使用字符串标记生成器将数据文件读入字符串

时间:2013-08-06 08:00:36

标签: structure binary-tree stringtokenizer readfile

嗨我有这个代码用于将文本文件读入字符串

void addStu    (BST_TREE* list)
{
// Local Declarations
   COMPANY* stuPtr;
   FILE* fp;
   int i = 0;
   char fileName[25];
   char buffer [100];
   char* tempString;
// Statements

   stuPtr = (COMPANY*)malloc (sizeof (COMPANY));
   stuPtr->name = (char*) malloc(128 * sizeof(char));
   stuPtr->market = (char*) malloc(128 * sizeof(char));
   stuPtr->initial = (char*) malloc(128 * sizeof(char));
   tempString = (char*) malloc(128 * sizeof(char));

   printf("Enter the file name: ");
           gets(fileName);
           fp = fopen(fileName, "r");
           if(fp == NULL)
           {
              printf("Error cannot open the file!\n");
              exit(101);
           }
   while(fgets(buffer, 100, fp) != NULL)
        {
            if (!stuPtr)
                printf("MEmory overflow!\n"), exit(101);
            tempString = buffer;
            stuPtr->name = strtok(tempString, ";");
            sscanf(buffer, "%15s   %15s    %f ", stuPtr->market, stuPtr->initial, &(stuPtr->stock));
            BST_Insert(list, stuPtr);
            i++;
        } // end while

} //addStu

此代码无法正常工作,因为当我甚至没有修改它时缓冲区会继续更改

这是我的输入

Microsoft Corporation;   NASDAQ MSFT    259.94B  
Yahoo! Inc.;             NASDAQ YHOO    37.67B  
Baidu.com, Inc. (ADR);   NASDAQ BIDU    8.64B  
CNET Networks, Inc.;     NASDAQ CNET    1.13B  
QuickLogic Corporation;  NASDAQ QUIK    88.62M  
Answers Corporation;     NASDAQ ANSW    53.49M  
Apple Inc.;              NASDAQ AAPL    114.17B  

例如,当我尝试读取第一行时,我能够使用字符串标记获取stuPtr-> name以包含Microsoft Coporation,在此之后,tempString将被修改为包含Microsoft Coporation同样,由于某种原因,不想更改的缓冲区,以及导致stuPtr->marketstuPtr->initialstuPtr->stock的缓冲区输入值都是错误的。

为什么缓冲区没有被修改就改变了?如何修复此代码才能使其正常工作?

提前感谢您的帮助

1 个答案:

答案 0 :(得分:0)

strtok()对OP有意想不到的副作用。

stuPtr->name = strtok(tempString, ";");之后,buffer位置以前被';'占用被'\ 0'取代。因此,当调用sscanf(buffer, "%15s ...时,会发生意外结果。建议:考虑混合strtok()和'sscanf()`之外的其他选择。

一个可以继续使用sccanf()

sscanf(&buffer[strlen(stuPtr->name)+1], "%15s ...

但建议仅使用sscanf()解决方案 strtok()strtof()