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

C 从文件读取可变长度数组,c,file,text-files,C,File,Text Files,我正在写一个C语言的程序,它应该访问文本文件来获取原型函数,以便进行进一步的计算。以下是存储在此类文件中的数据的简单示例: slc0.50.5 rdf 1.04 1.5 3.4 0.4 raq 0.2 0.44 jqw 7.23 6.2 0.23 1.56 1.345 1.0 首先是行的唯一ID,即“slc”或“jqw”,它将定义数组的内容。这是本书的唯一目的 糟糕的是,所有数组的长度都不同(比如从2个元素到60个元素)。我只想输入该行的ID(即“slc”),并将该行中的所有数字放入数组中 我想

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

slc0.50.5

rdf 1.04 1.5 3.4 0.4

raq 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文件的编辑变得复杂(即插入新行)


谢谢大家!

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

通常,您可以使用,
scanf
版本来处理这些类型的内容。特别是,在这些类型的示例中,我们必须考虑很多,并且必须有效地使用
sscanf
fscanf
fprintf
sprintf

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

我在这里给你参考。 只要开始使用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();         
}
#包括
int main(){
FILE*fp=fopen(“D:\\LangFiles\\CFiles\\Stackoverflow答案try\\numread.txt”,“r”);
字符a[]=“jqw”;
字符数字[50],str[5];
如果(!fp)
printf(“报告错误”);
而(!feof(fp)){
fscanf(fp,“%s%[^;]%*c”,str,digits);//读取str中的jqw,其余为digits并忽略;最后
如果(strcmp(str,a)==0){
而(1){
浮点数;
sscanf(数字、%f、&float_num);//读取单个数字
printf(“%f\t”,float\u num);
/*存储或使用float_num*/
if(strchr(digits,)//将数字ptr移动到下一个空格strcpy(digits,strchr(digits,)+1);//使数字ptr指向下一个空格字符
其他的
break;//数字为空后退出
}
break;//满足我们的要求后搬走
}
}      
getchar();
}
祝你万事如意。…

读一行完整的句子

继续使用(或
strtol()
strtoul()
)从行中获取数字,确保使用第二个参数检查错误(和/或
用于行终止?)并继续读取数字


对于数组,要么分配一个“足够大”的块(60个元素?),要么根据需要进行扩展。

感谢您的回复!我要试试。不要像这样使用feof()(在EOF被命中后,它将返回!=0)。相反,请检查来自fscanf()的返回。至少更好(更安全、更简单)的方法是围绕fgets()构建一个循环。