關於一個c語言讀取外部csv文件的問題


我用C語言來讀取csv文件中的多行多列數據,用的是fgets和sscanf函數,想一次讀取一行數據(包含多列),但是怎么也讀不

出來。希望能給出解決方法。謝謝了。 
我是這樣用的

  FILE* file;
  const char *filename;
  int file_ended = 0;        
  filename="tong.csv";   
  file=fopen(filename,"r");  
  if (file==NULL)
  robot_console_printf("%s: unable to locate the %s file\n",name,filename);
  fgets(l,100,file);    /* 從文件中讀取字符串 */

if (file_ended==0) {     /* read the data from the current line... */
ni = sscanf(l,"%f, %f, %f, %f, %f, %f", &motor_position[0],&motor_position[1], &motor_position

[2],&motor_position[3],&motor_position[4],&motor_position[5]);
    for(i=0;i<6;i++) /* convert to radian */
          next_position[i] = motor_position[i];
         for(i=0;i<6;i++)
     printf("%f\n",next_position[i]);  
程序還在調試,我把讀取文件的這部分程序貼出來。

7 个解决方案

#1


想一次讀取一行數據(包含多列),但是怎么也讀不 
用getline啊.

#2


將你的文件內容貼出來

#3



#include <device/robot.h>
#include <device/servo.h>
#include <math.h>


static DeviceTag left_heel_1,left_knee_1,left_hip_2,right_hip_2, right_knee_1,right_heel_1;
static float motor_position[]={
       0.0f, 0.0f, 0.0f, /* lleg */
       0.0f, 0.0f, 0.0f /* rleg */        
       };                                       
static float next_position[]={
      0.0f, 0.0f, 0.0f, /* lleg */
      0.0f, 0.0f, 0.0f /* rleg */
};   

/* static float pos_from_cvs[]={0.0f, 0.0f, 0.0f, /* lleg */
     /* 0.0f, 0.0f, 0.0f /* rleg */
/*};*/




static void reset(void) {
  left_heel_1=robot_get_device("left_heel_1");
  left_knee_1=robot_get_device("left_knee_1");
  left_hip_2=robot_get_device("left_hip_2");
  right_hip_2=robot_get_device("right_hip_2");
  right_knee_1=robot_get_device("right_knee_1");
  right_heel_1=robot_get_device("right_heel_1");
}




/* static char * joint_number_to_name(int num) {
  switch (num) {
  case 0: return "left_heel_1";
  case 1: return "left_knee_1";
  case 2: return "left_hip_2";
  case 3: return "right_hip_2";
  case 4: return "right_knee_1";
  case 5: return "right_heel_1";

  default: return "none";
  }
}


static void reset(void) {
  int i;

  for(i=0;i<6;i++) {
    joint[i] = robot_get_device(joint_number_to_name(i));

  }
}*/

int main() {
  int i;
  int ni;
  char l[500];
  FILE* file;
  const char *filename;
  const char *name;
  int file_ended = 0;        

  robot_live(reset);
  name=robot_get_name();
  filename="tong.csv"; /* name should be "Hoap-2 walk" */
  file=fopen(filename,"r");
  if (file==NULL)
  robot_console_printf("%s: unable to locate the %s file\n",name,filename);
  fgets(l,500,file);
  /* robot_console_printf("interpolating to reach start position\n"); */
  robot_step(5000); /* wait a little bit before starting */

  for(;;) { /* The robot never dies! */ 
    // else don't need to run, just perform a step
   /* if (fgets(l,1000,file)==NULL) { 
      fclose(file);
      file_ended = 1;
    }*/ 
  
if (file_ended==0) {     /* read the data from the current line... */
   ni = sscanf(l,"%f, %f, %f, %f, %f, %f\n", &motor_position[0],&motor_position[1], &motor_position[2],&motor_position[3],&motor_position[4],&motor_position[5]);
    for(i=0;i<6;i++) /* convert to radian */
          next_position[i] = motor_position[i];

  servo_set_position(left_heel_1,next_position[0]);
      servo_set_position(left_knee_1,next_position[1]);
      servo_set_position(left_hip_2,next_position[2]);
      servo_set_position(right_hip_2,next_position[3]);
      servo_set_position(right_knee_1,next_position[4]);
      servo_set_position(right_heel_1,next_position[5]);


robot_step(5000); /* run one step */
}
  return 0;
}


程序如上,這是一個仿真軟件的一個c語言程序,里面有一些是軟件本身自定義的函數,大家可以不用管,關鍵是怎樣一次讀取csv文件中一行數據,並且把一行中的六列數據分別放到一個數組里。

#4


重新發一下程序,刪除了一些沒用的程序。
#include <device/robot.h>
#include <device/servo.h>
#include <math.h>


static DeviceTag left_heel_1,left_knee_1,left_hip_2,right_hip_2, right_knee_1,right_heel_1;
static float motor_position[]={
       0.0f, 0.0f, 0.0f, /* lleg */
       0.0f, 0.0f, 0.0f /* rleg */        
       };                                       
static float next_position[]={
      0.0f, 0.0f, 0.0f, /* lleg */
      0.0f, 0.0f, 0.0f /* rleg */
};   


static void reset(void) {
  left_heel_1=robot_get_device("left_heel_1");
  left_knee_1=robot_get_device("left_knee_1");
  left_hip_2=robot_get_device("left_hip_2");
  right_hip_2=robot_get_device("right_hip_2");
  right_knee_1=robot_get_device("right_knee_1");
  right_heel_1=robot_get_device("right_heel_1");
}


int main() {
  int i;
  int ni;
  char l[500];
  FILE* file;
  const char *filename;
  const char *name;
  int file_ended = 0;        

  robot_live(reset);
  name=robot_get_name();
  filename="tong.csv"; /* name should be "Hoap-2 walk" */
  file=fopen(filename,"r"); /* 打開文件*/
  if (file==NULL)
  robot_console_printf("%s: unable to locate the %s file\n",name,filename);
  fgets(l,500,file);  /* 讀取文件 */

  for(;;) { /* The robot never dies! */ 
  
if (file_ended==0) {     /* read the data from the current line... */
ni = sscanf(l,"%f, %f, %f, %f, %f, %f\n", &motor_position[0],&motor_position[1], &motor_position[2],&motor_position[3],&motor_position[4],&motor_position[5]);    /* 將數據讀入數組中*/
 for(i=0;i<6;i++) /* convert to radian */
          next_position[i] = motor_position[i];

      servo_set_position(left_heel_1,next_position[0]);
      servo_set_position(left_knee_1,next_position[1]);
      servo_set_position(left_hip_2,next_position[2]);
      servo_set_position(right_hip_2,next_position[3]);
      servo_set_position(right_knee_1,next_position[4]);
      servo_set_position(right_heel_1,next_position[5]);


 robot_step(5000); /* run one step */
}
  return 0;
}
程序如上,這是一個仿真軟件的一個c語言程序,里面有一些是軟件本身自定義的函數,大家可以不用管,關鍵是怎樣一次讀取csv文件中一行數據,並且把一行中的六列數據分別放到一個數組里。

#5


程序貼出來,咋沒人理了?

#6



ni = fscanf(file,"%f,%f,%f,%f,%f,%f", &motor_position[0],&motor_position[1],
&motor_position[2],&motor_position[3],&motor_position[4],&motor_position[5]);

#7


2個問題  
1 文件的讀取是fscanf
2 文件讀取的時候  你需要讀取數據的形式需要和你文件里面存放的形式保持一致,你上面提到是多行多列的數據 但是讀取的時候是"%f,%f,%f,%f,%f,%f",
那肯定數據的格式是不匹配的. 

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
  © 2014-2022 ITdaan.com 联系我们: