C语言的文件I / O.

时间:2011-11-02 09:01:19

标签: c

我遇到以下功能的问题。我试图从一个位置获取数据,然后搜索指定的字符串。之后我打印结果值。 它第一次工作正常。如果我使用for循环调用该函数,但是我无法打印缓冲区值。

void parse_data(char *fname,int flag)
{
    char str[30]="<Response>";
    char buffer[1024],temp[1024],temp1[1024];
    int nVal=0;
    FILE *fp;
    int s_pos; //string position in the text
    int c_pos; //char position in the text
    char *string;
    char ccnt; //char count
    long lSize;
    long pos=0;
    int c;
    s_pos = -1;
    c_pos = 0;
    fp=fopen(fname,"r");
    //fseek(fp, 1, SEEK_SET);
    string = malloc(strlen(str)+1);
    if(fp==NULL)
    {
        printf("Unable to open the file \n");
        exit(0);
    }

    while (!feof(fp))
    {
        if (c_pos == 0)
        {
            for (ccnt = 1; ccnt <= strlen(str); ccnt++)
            {
                if (!feof(fp))
                {
                    string[ccnt - 1] = getc(fp);
                    if(nVal==1)
                    {
                        buffer[pos++] =   string[ccnt -1];
                    }
                }   //if
            }//for

        }//if
        if (c_pos != 0)
            if (!feof(fp))
            {
                for (ccnt = 0; ccnt <= strlen(str) - 2; ccnt++)
                    string[ccnt] = string[ccnt + 1];
                string[strlen(str) - 1] = getc(fp);
                if(nVal==1){
                    buffer[pos++] =   string[strlen(str) - 1];
                }
            }
        if (strcmp(string, str) == 0)
        {

            strcpy(str,"&lt;/Response&gt;");

            s_pos = c_pos;
            if(nVal==1){
                buffer[pos-strlen(str)]='\0';
                break;
            }
            nVal=1;

        }
        c_pos++;
    }
    if(fp!=NULL)
        fclose(fp);
    //printf("\n The String position is %d=\n",s_pos);
    if(flag==0)
        ParsingString_Inserting_To_DataBase(buffer);
    else if(flag==1)
        printf("The Buffer Value is %s \n",buffer);
}

int main()
{
    int i=0;
    char fname[30]="/tmp/gcc_trans.html";
    for(i=0;i<3;i++)
        parse_data(fname,1);
    return 0;
}

1 个答案:

答案 0 :(得分:1)

我试图理解你的代码而失败了。一些评论:

1.使用有意义的变量名称。请尝试pattern而不是str。为ccntnVal

使用更好的名称
  1. 尝试这种方法,而不是复杂的循环:

    • 逐个字符阅读,直至找到&
    • 读取N个字节并检查它们是否为lt;Response&gt;,其中N是字符串的长度。如果是,打破循环。如果不是,请向后搜索N个字节。

    • 将当前偏移量保存在文件

    • 使用&lt;/Response&gt;重复上述代码。将此代码移动到辅助函数中。

    • N =当前偏移 - 第一次偏移

    • 使用N个字节分配缓冲区
    • 寻求第一次抵消
    • 将N个字节读入缓冲区