从文件中读取可变长度数组

时间:2012-03-15 16:55:53

标签: c file text-files

我正在C上编写一个程序,它应该访问文本文件以获取原型函数以进行进一步的计算。以下是存储在此类文件中的简单数据示例:

slc 0.5 0.5;

rdf 1.04 1.5 3.4 0.4;

raq 0 0.2 0.44;

jqw 7.23 6.2 0.23 1.56 1.345 1.0;

首先是行的唯一ID,即“slc”或“jqw”,它将定义数组的内容。这是这个字符的唯一目的。

糟糕的是所有数组都有不同的长度(例如从2个元素到60个)。我想只输入行的ID(即“slc”)并将此行中的所有数字都放入数组中。

我想问你解决这个问题的可能策略。不是真的需要代码,只有有效的策略。对我来说,替代解决方案是为每个ID使用已知的偏移量和数组长度,尽管这不是最佳解决方案,因为它使txt文件的版本复杂化(即插入新行)。

谢谢!

3 个答案:

答案 0 :(得分:0)

创建一个60的数组(如你所说)。填写并记下该桶装满了多少。如果您担心内存,请将其复制到适当的大小(malloc)。否则,只需将60个浮点数/双精度数与该特定行的数组中的数字一起存储。

答案 1 :(得分:0)

通常,您可以使用scanf版本来玩这些类型的内容。特别是,在这些类型的示例中,我们必须考虑很多,我们必须有效地使用sscanffscanffprintfsprintf等...

特别是,我对这个问题感兴趣,并编写了我自己的程序。

我在这里给你参考。 刚开始玩I / O功能,以达到目标......

#include<stdio.h>
int main(){
       FILE* fp = fopen("D:\\LangFiles\\CFiles\\Stackoverflow answers try\\numread.txt","r");
       char a[] = "jqw";
       char digits[50],str[5];       

       if(!fp)
        printf("Reporting error");


       while(!feof(fp)){
            fscanf(fp,"%s %[^;] %*c",str,digits);  //reading the jqw in str and rest in digits and ignoring the ; at the last

            if(strcmp(str,a) == 0){           
               while(1){
                   float float_num;
                   sscanf(digits,"%f",&float_num);  //reading a single digit
                   printf("%f\t",float_num);
                         /*Store or use float_num*/                                                              
                   if(strchr(digits,' '))         //moving the digits ptr to next space                             strcpy(digits , strchr(digits,' ')+1 );  //making digits ptr to point the next char of space
                   else
                       break;  //exiting once the digits is empty
                }

                break; //moving out after our requirement is satisfied
            }

      }      
getchar();         
}

一切顺利.....

答案 2 :(得分:0)

使用fgets()阅读完整的一行。

继续使用strtod()(或strtol()strtoul())获取数字,确保使用第二个参数来检查错误(和/或{{1}对于行终止?)并继续阅读数字。

对于阵列,要么分配一个足够大的&#34;&#34;块(60个元素?)或根据需要增长。