我一直坚持这个问题。
我正在创建一个读入输入文件的程序(只是一个普通的.Txt)这个输入文件以下列格式存储变量:
x
21
% This is a comment
y
3
等等。我的目标是读取此输入文件(完成),然后将文件中的每个变量存储到我的c程序中的全局变量中。即全局变量x将具有值21,y将在我的c文件中具有值3,而忽略注释。
我已经考虑了一段时间,无法弄清楚要使用哪些功能。任何建议都将不胜感激,谢谢。
(请注意,这些变量将始终具有相同的名称,但它们的显示顺序将不同于输入文件到输入文件)。
答案 0 :(得分:1)
我建议你有一个包含两个字段的结构。
struct Foo
{
char var_name;
int var_value;
};
然后创建这些结构的数组,其中包含输入文件中预期变量的大小。
struct Foo input_array[n];
然后,当您阅读文件时,您可以设置结构字段...
for(int i = 0; i < n ; i++){
input_array[i].var_name = input_var_name;
input_array[i].var_value = input_var_value;
}
之后您打印了这些值,它们已经按顺序排列。
答案 1 :(得分:1)
首先,我们需要变量将值读入:
int x, y, z /* etc */;
现在,让我们创建一个指针数组,以便我们可以轻松访问变量:
int *array[] = { &x, &y, &z /* etc */ };
现在,我们需要FILE*
来访问该文件:
FILE* fp;
打开文件:
fp = fopen("filename.txt", "r"); /* 'r' for reading */
检查文件是否成功打开:
if(fp == NULL)
{
printf("Error opening file");
exit(-1); /* Exit the program */
}
现在,使用fscanf
:
int counter = 0; /* For keeping track of the array index */
for(;;) { /* Infinite loop */
int retVal = fscanf(fp, "%d", array[counter]); /* Capture return value of fscanf */
if(retVal == 1) /* Successfully scanned a number */
{
counter++;
}
else if(retVal == 0) /* Failed to scan a number */
{
fscanf(fp, "%*s"); /* Discard a word from the file */
}
else /* EOF */
{
break; /* Get out of the loop */
}
}
现在,打印扫描数据:
int i;
for(i = 0; i < counter; i++)
printf("%d", *array[i]);
最后,关闭文件:
fclose(fp);
完整代码,添加了@ Jongware的建议:
int x, y, z /* etc */;
int *array[] = { &x, &y, &z /* etc */ };
char line[1024];
const char *varNames[] = { "x", "y", "z" };
int tmp = -1;
FILE* fp;
fp = fopen("filename.txt", "r"); /* 'r' for reading */
if(fp == NULL)
{
printf("Error opening file");
exit(-1); /* Exit the program */
}
int counter = 0;
for(fgets(line, sizeof(line), stdin)) {
if(line[0] == '%')
continue;
else
{
tmp = -1;
for(int i = 0; i < sizeof(varNames) / sizeof(*varNames); i++)
{
if(strcmp(line, varNames[i]) == 0)
{
tmp = i;
break;
}
}
fgets(line, sizeof(line), stdin);
sscanf(line, "%d", array[tmp]);
}
}
int i;
for(i = 0; i < counter; i++)
printf("%d", *array[i]);
fclose(fp);
以上所有代码均未经测试