C Как разделить чтение переменной из .txt файла scanf - PullRequest
0 голосов
/ 01 марта 2012

Может кто-нибудь помочь мне с этой проблемой? У меня есть .txt файл, который я читаю, используя C, как показано ниже, fopen. Я могу отобразить текст как переменную на экране, что хорошо. Однако текст, который я читаю из файла, разделен запятой. Как я могу разбить строку из текстового файла на две переменные вместо одной?

Пример

имя пользователя, пароль

Я бы хотел, чтобы конечный результат был

var1 = имя пользователя var2 = пароль

Вот мой код.

inFile = fopen("logfile.txt", "r"); /*This opens the file */    
if (inFile == NULL)            /*Checks that the file exists*/ {        
    printf("\nThe file %c was not opened successfully.", fileName);     
    printf("\nPlease check that you entered the file name correctly.\n");       
    exit(1);    
}   
while (fscanf(inFile, "%s", text) !=EOF) /*Reads and displays the file*/        
    printf("%s\n", text);   
fclose(inFile);

Вид исправления

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

int main (void) { 
    char *s; 
    char test[50];
    int i=0;
    char str[] = 
        "username,password";
    printf ("%s\n", str); 
    s = strtok (str, ","); 
    // 
    while (s != NULL) { 
        printf ("%s\n", s); 

        s = strtok (NULL, ","); 

} 
        system("pause");
    return 0; 

} 

Ответы [ 3 ]

3 голосов
/ 01 марта 2012

Функция strtok - это то, что вы ищете

0 голосов
/ 01 марта 2012

Если вы можете убедиться в том, что в качестве разделителя полей указано ',' и входные данные имеют только два поля. Поскольку strtok не является повторно вводимой функцией, поэтому обычно я использую scanf вместо strtok, когда формат данных ввода уже известен.

int re;
char line[200];
char usernme[100];
char password[100];
while (fgets(line, 200, inFile) != NULL)
{
    /*Reads and displays the file*/        
    re = sscane(line, "%[^","],%s", username, password);
    if(re == 2)
    {
        printf("Usarname = %s, Password = = %d\r\n", username, password);
    }
}
0 голосов
/ 01 марта 2012

Процесс заключается в использовании функции strtok. Функция выполняет замену разделителя (в данном случае ,) на символ \0 (ноль). Затем он возвращает указатель на начало строки, которая теперь заканчивается на \0. Если запустить снова с пропущенным в него значением NULL, он будет снова разделен на основе разделителя (если он существует) и вернет указатель на вторую часть строки. Ниже приведен код, который необходимо добавить:

#include <string.h>
char* var1;
char* var2;

А затем в вашем цикле while:

{
    var1 = strtok(text,",");
    var2 = strtok(NULL,",");
    printf("%s<NOT A ','>%s\n", var1,var2);
}

То, что это делает со строковым текстом, выглядит следующим образом. Когда мы получим это из файла, text =

/------------------------------------\
|u|s|e|r|n|a|m|e|,|p|a|s|s|w|o|r|d|\0|
\------------------------------------/

Первая строка цикла while изменяет его так, что text =

/-------------------------------------\
|u|s|e|r|n|a|m|e|\0|p|a|s|s|w|o|r|d|\0|
\1------------------------------------/

Где var1 указывает на букву выше 1, таким образом var1 = username. Обратите внимание, что это означает, что если вы запустите printf на text, вы также получите имя пользователя. После второй строки text =

/-------------------------------------\
|u|s|e|r|n|a|m|e|\0|p|a|s|s|w|o|r|d|\0|
\1------------------2-----------------/

А теперь var1 указывает на строку «имя пользователя», а var2 указывает на строку «пароль». Если вы напечатаетеf text, вы все равно получите «username».

Обратите внимание, что если вы хотите получить больше двух переменных, вам нужно иметь предохранитель, обеспечивающий, чтобы strtok не возвращал NULL, прежде чем пытаться использовать строку.

Также обратите внимание, что если вы измените text, вы также испортите var1 и var2. Я бы предложил использовать strcpy для другой строки, если вы хотите хранить информацию более постоянным образом.

...