2017-02-10 8 views
0

Вы можете мне помочь? У меня есть строка 23;56;36.6;run в txt-файле. Затем я читаю эту строку, чтобы использовать ее для некоторой работы: я хотел бы взять эти значения из строки, затем сравнить их с некоторыми значениями в коде и вывести свой результат в консоль. Я думаю, я должен использовать функцию atoi(), которая делает мою строку в числах, для выделения, я использую strtok(). Но как правильно я должен записывать свои токены в цикле while, а последний токен - это тип символа. Как я могу сделать эту работу?Прочтите текст и введите его (int) в C

КОД:

void printInfo(int note) 
{ 
    int i; 
    FILE *out; 
    char str[250]; 
    char sp[10]=";"; 
    char *istr; 


    if ((out =fopen("test.txt","r"))==NULL) 
     printf("Error open, file\n"); 
    else 
    { 
     for (i=0;i<note;i++) 
     { 
      fgets(str,250,out); 
      istr=strtok(str,sp); 
      while (istr != NULL) 
      { 
       printf("%d\n",atoi(istr)); 
       istr=strtok(NULL,sp); 
       // I think, I need to create a variable for recording my values. 
      } 
     } 
    } 
    fclose(out); 
} 
+0

Вы можете конвертировать строки к целому (или поплавкам) с 'sscanf'. – d3L

+0

Я бы сказал, что самое простое решение просто: 'sscanf (« 23; 56; 36,6; run »,«% f;% f;% f; », & n [0], & n [1], &n[2]);' – d3L

ответ

1

Я хотел бы использовать sscanf, чтобы преобразовать строку в трех поплавков:

#include <stdio.h> // sscanf 
#include <stdlib.h> // EXIT_SUCCESS 
#include <string.h> // memset 

int main(void) { 
    const char *input = "23;56;36.6;run"; 
    int i; 
    float numbers[3] = {0, 0, 0}; 
    char buf[10]; 
    int nElementsRead; 

    // init buf 
    memset(buf, 0, sizeof(buf)); 

    // sscanf returns the number of read elements 
    // or EOF on error 
    nElementsRead = sscanf(input, "%f;%f;%f;%9s", &numbers[0], &numbers[1], &numbers[2], buf); 

    if (nElementsRead == 4) { 
     printf("Successfully read %d elements\n", nElementsRead); 

     for (i = 0; i < 3; ++i) { 
      printf("number[%d]: %f\n", i, numbers[i]); 
     } 

     printf("Buffer is: %s\n", buf); 
    } else { 
     printf("Something went wrong!"); 

     return EXIT_FAILURE; 
    } 

    return EXIT_SUCCESS; 
} 
+0

спасибо , но как это должно быть с символом 'char' последним токеном? –

+0

Вы также можете читать символы с помощью' sscanf': 'sscanf (input,«% 10s », buf);' означает, что вы хотите сканировать строку, максимальную 1012 символов. – d3L

+0

Я обновил свой ответ, чтобы принять это во внимание. – d3L

0

Другое решение, используя сопоставимые записи:

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 

typedef struct MyRecord_s { 
    int f1; 
    int f2; 
    float f3; 
    char f4[10]; 

} MyRecord; 

static int MyRecordInit(MyRecord * out, char * line) { 
    if(out == NULL) { 
     return 0; 
    } 
    char * f1 = strtok(line, ";"); 
    char * f2 = strtok(NULL, ";"); 
    char * f3 = strtok(NULL, ";"); 
    char * f4 = strtok(NULL, ";"); 
    if(f1 && f2 && f3 && f4) { 
     char * err = NULL; 
     out->f1 = strtol(f1, &err, 10); 
     if(err && *err) { 
     return 0; 
     } 
     out->f2 = strtol(f1, &err, 10); 
     if(err && *err) { 
     return 0; 
     } 
     out->f3 = strtof(f1, &err); 
     if(err && *err) { 
     return 0; 
     } 
     strncpy(out->f4, f4, 10); 
     out->f4[9] = '\0'; 
     return 1; 
    } 
    return 0; 
} 

int MyRecordCmp(const MyRecord * r1, const MyRecord * r2) { 
    int diff = r1->f1 - r1->f2; 
    if(diff) { 
     return diff; 
    } 
    diff = r1->f2 - r2->f2; 
    if(diff) { 
     return diff; 
    } 
    float d = r1->f3 - r2->f3; 
    if(d > 0.000001) { 
     return +1; 
    } 
    if(d < -0.000001) { 
     return -1; 
    } 
    return strcmp(r1->f4, r2->f4); 
} 

int main() { 
    char line1[] = "23;56;36.6;run"; 
    char line2[] = "24;57;37.6;stop"; 
    MyRecord r1, r2; 
    if(MyRecordInit(&r1, line1) && MyRecordInit(&r2, line2)) { 
     printf("cmp: %d\n", MyRecordCmp(&r1, &r2)); 
    } 
    return 0; 
}