使用C从文本文件中读取输入参数

时间:2014-04-12 23:03:16

标签: c file-io c-strings

我正在尝试编写一个通用函数,它将从格式化文本文件中读取参数。我希望它足够灵活,参数列表可以变化。在C中完成此任务的最佳方法是什么?

我几天来一直在努力奋斗。我能够从文件中提取的字符串不是我所期望的。我用来调试的示例文本文件很简单:

Nx : 1600;
Ny : 400;
dx : .524584;
dy : .25;
dt : 1;

我的节目如下。

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

int main(int argc, char * argv[])
{
if(argc!=2)
{   
    printf("ERROR:  Usage: ./Practice3 <input file>");      
}
else
    {
FILE * fr = fopen(argv[1], "rt");


if(fr == NULL){printf("file %s not found", argv[1]);}

char * tmpstr1 ;
char * tmpstr2 ;

char * delimPtr;
char * endPtr;

int Nx = 0;
int Ny = 0;
double dx = 0;
double dy = 0;

    char tempbuff[100];

    while(!feof(fr)) 
    {
         if (fgets(tempbuff,100,fr)) {

            delimPtr = strstr(tempbuff,":");
            endPtr = strstr(delimPtr,";");
            strncpy(tmpstr1,tempbuff,delimPtr-tempbuff);
            strncpy(tmpstr2,delimPtr+2 ,endPtr-delimPtr-2);
            printf("<<%s>>\n",  tmpstr1);
            printf("<<%s>>\n",  tmpstr2);

            if (strcmp(tmpstr1,"Nx")==0) {
                 Nx = atoi(tmpstr2);
            } 
            else if (strcmp(tmpstr1,"Ny")==0) {
                 Ny = atoi(tmpstr2);
            }
            else if (strcmp(tmpstr1,"dx")==0) {
                 dx = atof(tmpstr2);
            }
            else if (strcmp(tmpstr1,"dy")==0) {
                 dy = atof(tmpstr2);
            }
            else{
                printf("Unrecongized parameter : \"%s\"\n", tmpstr1);
            }


         }


    }


    fclose(fr);

    printf("\nNx : %d \nNy : %d  \ndx : %f  \ndy : %f \n",  Nx,Ny,dx,dy);


}//end of code executed when input is correct 


}

我正在使用gcc -std = c99进行编译。 tmpstr1变量在末尾打印出一个奇怪的blob字符。我不能像现在这样可靠地提取参数名称。什么是更好的方式?

此外,似乎tmpstr2并没有完全被strncpy覆盖,所以数字变得混乱了。似乎C不是设计用于轻松进行这种刺痛操作。但是我必须使用C来上课,所以我被困住了。有什么想法吗?

2 个答案:

答案 0 :(得分:2)

char tmpstr1[16];
char tmpstr2[16];
...
/*
delimPtr = strstr(tempbuff,":");
endPtr = strstr(delimPtr,";");
strncpy(tmpstr1,tempbuff,delimPtr-tempbuff-1);
strncpy(tmpstr2,delimPtr+2 ,endPtr-delimPtr-2);
*/
sscanf(tempbuff, "%15s : %15[^;];", tmpstr1, tmpstr2);

答案 1 :(得分:0)

正如John3136所指出的那样,你没有为tempstr1tempstr2分配任何内存。您可能希望将它们定义为tempbuf,作为堆栈数组。
此外,您滥用strncpy()
a)您复制的字符串部分不是以空值终止的,因此memcpy()在您的情况下是等效的,这将我们带到了 b)您没有空终止符。 strncpy()如果在被告知要复制的字符数中没有遇到空终结符,则不会添加空终止符。因此,您需要手动设置空终止符:tempstr[n] = '\0'