Извлечение цифр в массив строк путем чтения из файла - PullRequest
1 голос
/ 07 мая 2020

У меня есть файл трассировки, где есть n строк, каждая из которых имеет последовательность чтения / записи, за которой следует шестнадцатеричный 32-битный адрес. Примерно так:

read  0x20000064
write 0x20000068
read  0x2000006c

Я не могу извлечь только 32-битный адрес и чтение / запись, например, 20000064 из файла для каждой строки. Итак, я намереваюсь прочитать строку за строкой из файла trace , а затем разделить каждую строку на две подстроки и предпринять некоторые действия на основе подстроки.

    // Read the second part of sub-string and store as str1
    address = str1 & 0xffff;
    // read first part of sub-string and store as str0
    if (str0 == read)
         read_count++;
    else if (str0 == write)
         write_count++;

Итак, Короче говоря, я застрял в разделении струны на две части и работе над ними. Я перепробовал все, от strtok() до fseek(), но ничего не работает.

У меня есть файл трассировки с содержимым

read   0x20000064
write  0x20000084
read   0x20000069
write  0x20000070
read   0x20000092

И код, который я пробовал

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

int main() {
    FILE *fp;
    int i = 0, j = 0, k = 0, n;
    char *token[30];
    char delim[] = " ";
    char str[17], str2[17];
    char str3[8];
    fp = fopen("text", "r");

    while(fgets(str, 17, fp) != NULL) {
        fseek(fp, 0, SEEK_CUR);
        strcpy(str2, str);
        i = 9;
        n = 8;
        while (str[i] !='\0' && n >= 0) {
            str3[j] = str2[i];
            i++;
            j++;
            n--;
        }
        str3[j] = '\0';
        printf("%s\n", str3);
    }
    fclose(fp);
}

PS Этот код работает, но только для первой строки, после этого у меня возникает ошибка сегментации.

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

int main() {
    FILE *fp;
    int i;
    char *token[30];
    char delim[] = " ";
    char str[17], str2[100][17];
    char str3[17];
    int n = 9, pos = 0;
    fp = fopen("text", "r");

    while (fgets(str, 17, fp) != NULL) {
        fseek(fp, 0, SEEK_CUR);
        strcpy(str2[i], str);
        if ((n + pos - 1) <= strlen(str2[i])) {
            strcpy(&str2[i][pos - 1], &str2[i][n + pos - 1]);
            printf("%s\n", str2[i]);
        }
        i++;
    }
    fclose(fp);
}

Выходные данные:

20000064
Segmentation fault

Выход I ожидайте:

20000064
20000084
20000069
20000070
20000092

1 Ответ

1 голос
/ 07 мая 2020

Вы должны проанализировать строки с помощью sscanf():

#include <stdio.h>

int main() {
    char line[80];
    char command[20];
    unsigned long address;
    FILE *fp;

    if ((fp = fopen("text", "r")) == NULL) 
        printf("cannot open text file\n");
        return 1;
    }
    while (fgets(line, sizeof line, fp) != NULL) {
        if (sscanf(line, "%19s%x", command, &address) == 2) {
            printf("command=%s, address=%x\n", command, address);
        }
    }
    fclose(fp);
    return 0;
}
...