2013-12-07 2 views
0

Я пытаюсь прочитать несколько разных типов данных (char, int, float) из текстового файла непосредственно в структуру.(C) Чтение из текстового файла в структуру

readData() { 
char filename[100]; 
int linesread; 
int i = 0; 

printf("Enter the assets text file that you wish to read: \n"); 
scanf("%s", filename); 

if ((fp = fopen(filename, "r")) == NULL) { 
    printf("Error opening data file\n"); 
    readData(); 
} else { 
    while (fscanf(fp, "%s %c %s %lf %lf %d %d %d", &assets[i].name, &assets[i].type, &assets[i].location, &assets[i].longi, &assets[i].lati, &assets[i].speed, &assets[i].fuelTime, &assets[i].readyTime != EOF)) { 
     i++; 
    } 
} 
fclose(fp); 
linesread = i; 

for (i = 0; i < linesread; i++) { 
    printf("%s %s %s %lf %lf %d %d %d\n", &assets[i].name, &assets[i].type, &assets[i].location, &assets[i].longi, &assets[i].lati, &assets[i].speed, &assets[i].fuelTime, &assets[i].readyTime); 
} 

Это должны прочитать из (когда он решает сотрудничать) и сохранить его в структуру:

Angle_Lifeboat L Angle 51.685 -5.102 25.0 600 120 
Angle_ILB L Angle 51.685 -5.102 25.0 180 30 
Broad_Haven_ILB L Broad_Haven 51.713 -5.113 25.0 180 30 

Но вместо этого читает этот

ngle_Lifeboat LAngle Angle 0.000000 0.000000 0.000000 4231936 4231940 
Angle_ILB LAngle Angle 0.000000 0.000000 0.000000 4232008 4232012 
Broad_Haven_ILB LBroad_Haven Broad_Haven 0.000000 0.000000 0.000000 4232080 4232084 

Я довольно новый на C, так что легко на меня. Любая помощь вы можете дать бы массово оценили

EDIT: Stucture ->

typedef struct assets{ 
char name[25]; 
char type[1]; 
float longi; 
float lati; 
char location[20]; 
int speed; 
int fuelTime; 
int readyTime; 
} assets; 
+0

Просьба показать объявление вашей «структуры». – dasblinkenlight

+2

'! = EOF' плохая позиция. – BLUEPIXY

+0

Отредактировано положение EOF – Kamon241

ответ

0
fread(&my_struct, sizeof(my_struct), 1, fp); 
+1

Это просто worng. 'fread()' не читать текстовые файлы. – alk

0

В программирования C я думаю, уже есть в функции сборки сделать выше ... попробуйте использовать Fread http://www.tutorialspoint.com/c_standard_library/c_function_fread.htm

+1

Предложения/Мышление не являются ответами на такие вопросы – P0W

+0

извините @POW предложение рассмотрено ... – adrain

+0

Любая помощь довольно большая. «fread» выглядит полезным, может кто-нибудь дать мне несколько советов о том, как правильно его использовать – Kamon241

0
  • BLUEPIXY правильно заметил != EOF плохое положение; правильным является:

    … &assets[i].readyTime) != EOF) { 
    
  • Мы не можем напечатать символ в assets[i].type в виде строки с %s, потому что 1-углеродно массив type[1] не имеет (место для) завершающий нулевой символ; мы должны напечатать его в виде строки с точностью .1 или символ:

    printf("…%.1s…\n", …assets[i].type…); // need no & operator 
    

    или

    printf("…%c…\n", …*assets[i].type…); // need * operator 
    
  • Спецификация преобразования %lf для указателя на double (а не float); float s требуется спецификация преобразования %f.

  • Поскольку значения speed равны 25.0, мы не можем считать их целыми числами с %d; нам нужно прочитать переменную float с %f, либо временную переменную, которая затем назначается assets[i].speed, либо путем определения float speed; в assets.

Смежные вопросы