Sscanf в C - чтение чисел из .txt. файл - PullRequest
1 голос
/ 19 января 2020

Я написал программу, которая читает все числа из файла .txt - она ​​работает нормально. Однако я хотел бы использовать только одну функцию sscanf в моей программе, считывающую все числа, вместо того, чтобы снова использовать isdigit(*poi) и sscanf.

Если я не использую isdigit(*poi), я не получу числа, которые были бы в начале строки в файле .txt.

Как я могу сказать sscanf продолжать чтение, даже если нет подходящей строки?

Код:

int test(FILE *file, FILE *file2){
    int l = 0;
    int nc = 0;
    char buffer[1000];
    char *poi = NULL;
    fprintf(file2, "\n");
    while(fgets(buffer, 1000, file) != NULL){
        poi = buffer;
        while(*poi){
            if(isdigit(*poi)){
                sscanf(poi, "%d%n",&zahl[l].number, &nc);
                poi += nc;
                fprintf(file2, "%d ", zahl[l].number);
            }
            if(1 == sscanf(poi, "%*[^0-9]%d%n",&zahl[l].number, &nc)){
                poi += nc;
                fprintf(file2, "%d ", zahl[l].number);
            }
            else{
                break;
            }
            l++;

        }
        fprintf(file2, "\n");
    }
    return 0;
}

Образец текста в .txt:

text 2025 text text 25 text text text 1h text
26 text text text text 4,5h.
text text text text 19h

Выходные данные должны быть:

2025 25 1
26 4 5 
19

С добавлением будет в порядке:

    if(1 == sscanf(poi, "%*[^0-9]%d%n",&zahl[l].number, &nc)){
            poi += nc;
            fprintf(file2, "%d ", zahl[l].number);
        }

Вместо использования:

        if(isdigit(*poi)){
            sscanf(poi, "%d%n",&zahl[l].number, &nc);
            poi += nc;
            fprintf(file2, "%d ", zahl[l].number);
        }

Ответы [ 2 ]

3 голосов
/ 19 января 2020

Я хотел бы использовать только одну функцию sscanf в моей программе

Использовать возвращаемое значение sscanf(). Если это не 1, увеличьте poi и повторите сканирование следующего символа.

while(fgets(buffer, 1000, file) != NULL){
  poi = buffer;
  while(*poi){
    int nc = 0; 
    int cnt = sscanf(poi, "%d%n", &zahl[l].number, &nc);
    if (cnt == 1) {
      poi += nc;
      fprintf(file2, "%d ", zahl[l].number);
    } else {
      poi++;
    }
  }
  fprintf(file2, "\n");
}
2 голосов
/ 19 января 2020

сделать %[^0-9]%n отдельным sscanf. Установите nc на ноль, и если это sscanf не удастся, ноль будет добавлен к offset.
sscanf для целого числа, а если это не удастся, вырвитесь из l oop.

#include <stdio.h>

int main ( void) {
    char *poi = NULL;
    char *lines[] = {
    "text 2025 text text 25 text text text 1h text"
    , "26 text text text text 4,5h."
    , "text text text text 19h"};
    int value = 0;
    int nc = 0;
    for ( int each = 0; each < 3; ++each) {
        poi = lines[each];
        while ( 1) {
            nc = 0;
            sscanf ( poi, "%*[^0-9]%n", &nc);
            poi += nc;
            if ( 1 == sscanf ( poi, "%d%n", &value, &nc)) {
                printf ( "%d ", value);
                poi += nc;
            }
            else {
                break;
            }
        }
        printf ( "\n");
    }
    return 0;
}

для обработки - цифры.

#include <stdio.h>

int main ( void) {
    char *poi = NULL;
    char *lines[] = {
    "text 2025 text text 25 text text text 1h text"
    , "26 text text text text 4,-5h."
    , "text text text text 19h"};
    int value = 0;
    int nc = 0;
    for ( int each = 0; each < 3; ++each) {
        poi = lines[each];
        while ( 1) {
            nc = 0;
            sscanf ( poi, "%*[^0-9]%n", &nc);
            poi += nc;
            if ( poi > lines[each]) {
                if ( '-' == *(poi - 1)) {
                    --poi;
                }
            }
            if ( 1 == sscanf ( poi, "%d%n", &value, &nc)) {
                printf ( "%d ", value);
                poi += nc;
            }
            else {
                break;
            }
        }
        printf ( "\n");
    }
    return 0;
}
...