我有一个包含; 分隔符的CSV文件。数据是双重类型,例如: 0.66985787869876; 0.254886543778; 475.36552366 \ n 0.454585787869854; 0.484254886543755578; 512.36552374 \ n
在CyberSpock回答后更新了代码。 我的问题似乎是fgets(仅显示printf)而不是完整的第一个值线
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
double LoadCSV(double *Tab[][100])
{
char* token;
double intermed;
char* test;
FILE *fp;
fp = fopen("file.csv","r");
char line[128];
int i=0, j=0;
while (fgets(line, sizeof(line), fp) != NULL)
{
for (token = strtok(line,";"); token != NULL ; token = strtok(NULL, ";"))
{
token=strchr(token, "\n") ;
intermed=atof(token);
printf("%f", intermed);
*Tab[i][j]= intermed;
i++;
}
printf("%f", *Tab[3][j]);
j++;
}
//fclose(fp);
return 0;
}
int main(){
double Tab[50][100]; //max fixed size
int k=0;
int l=0;
LoadCSV(Tab);
while (k< 4)
{
printf("Tab = %f", Tab[k][l]);
k++;
}
}
旧帖子 输入CSV的大小每次都可以不同:一次3列,另外46列。
然后我认为我不能像scanf一样使用scanf(文件,&#34;%f&#34 ;;&#34;%f&#34 ;;&#34;%f&#34;, varA,varB,VarC);因为vars是固定的一次。
虽然我尝试使用此代码,但我对var命名为c:
有问题#include <stdio.h>
#include <stdlib.h>
#include <math.h>
double TabInput[100]; //max fixed size
double LoadCSV()
{
FILE *fp;
int c;
char cumulate[100];
int i=0;
fp = fopen("file.csv","r");
if(fp == NULL)
{
perror("Error in opening file");
}
while(1)
{
c = fgetc(fp);
if( feof(fp) )
{
break ;
}
if (c != ";" || c != "\n")
{
printf("%s",c);//*************PROBLEM C is an int
strcat(cumulate, d);//********PROBLEM THERE
}
else
{
TabInput[i]= atof(cumulate); //str to double
i++;
}
if (c == "\n")
{
break ;
}
}
fclose(fp);
//return(TabInput);
}
int main(){
int j=0;
LoadCSV();
while (j< 4)
{
printf("Tab = %f", TabInput[j]);
j++;
}
}
感谢您的帮助。最好的。
答案 0 :(得分:3)
使用 strtok 代替
char line[128];
fgets( line, sizeof(line), fp );
for (char* token = strtok( line, ";"); token != NULL; token = strtok(NULL, ";"))
{
TabInput[i++] = atof(token);
}
因此,您一次只读一行,然后使用strtok
解析该行。
strtok
将字符串line
拆分为多个字符串,并返回指向\ 0终止字符串的指针。您需要做的唯一事情是使用atof将字符串转换为float / double。在for循环令牌的每次迭代中,将指向line
中的新字符串。
为了将CSV文件拆分成行和列,您可以执行类似这样的操作
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXROWS 10
#define MAXCOLS 5
int main()
{
int rowIndex = 0;
double rows[MAXROWS][MAXCOLS] = {{0,0}};
char line[128];
char* token = NULL;
FILE* fp = fopen("myfile.csv","r");
if (fp != NULL)
{
while (fgets( line, sizeof(line), fp) != NULL && rowIndex < MAXROWS)
{
int colIndex = 0;
for (token = strtok( line, ";"); token != NULL && colIndex < MAXCOLS; token = strtok(NULL, ";"))
{
rows[rowIndex][colIndex++] = atof(token);
}
rowIndex++;
}
fclose(fp);
}
for (int i = 0; i < rowIndex; ++i)
{
for (int j = 0; j < MAXCOLS; ++j)
printf("%10.4lf", rows[i][j]);
putchar('\n');
}
return 0;
}