2014-06-13 3 views
1

У меня есть файл с более чем 6000 строк данных об ошибках.Прочитать до конца строки

P000800 Engine Position System Performance 
P000900 Engine Position System Performance 
P001000 "A" Camshaft Position Actuator Circuit 
P001100 "A" Camshaft Position - Timing Over-Advanced or System Performance 
P001200 "A" Camshaft Position - Timing Over-Retarded 

Первая строка всегда слева, а затем пробелом и описанием.

Для жизни меня я не могу вспомнить, как заставить его прочитать описание до конец строки.

Я ставлю это в другой файл, который будет выглядеть, как это для MySQL импорта

P000800,Engine Position System Performance 
P000900,Engine Position System Performance 
P001000,"A" Camshaft Position Actuator Circuit 
P001100,"A" Camshaft Position - Timing Over-Advanced or System Performance 
P001200,"A" Camshaft Position - Timing Over-Retarded 

Если вы не знаете о более простой способ, чтобы сделать его совместимым для базы данных MySQL.

while ((fgets(line, sizeof(line), fp_code) != NULL) && (line[0] != '\n')){ 
    sscanf(line,"%s %s",ercode, desc); 
} 

Благодаря Боб

+0

Некоторые идеи на http://codereview.stackexchange.com/questions/31095/reading-unlimited-input-strings-in-c/31106#31106 – chux

+0

'если (sscanf (строка"% s% [^ \ n] ", ercode, desc) == 2) GoodToGo();' – chux

ответ

0

Как вы объявляете line: это что-то вроде char *line или char line[100]? Это важно, потому что, как вы получаете его размер, используется оператор sizeof. Для первого, sizeof даст вам размер указателя, в то время как для второй, это даст вам реальный размер, который 100.

Кроме того, ваша проверка символа новой строки должен быть последним символом, line[strlen(line) - 1], а не первый символ, line[0].

Другое дело, вы не можете положиться на fgets, чтобы получить все символы в строке, потому что вы ограничены sizeof(line). Одним из решений является итерация, пока вы не получите символ новой строки, а затем обработайте строку в целом.

+0

Я объявил его строкой char [256]; – bpross

+0

chux & R Sahu, они отлично работали. Они не позволяют мне голосовать за ваш ответ. – bpross

0

Фактическая реализация я видел, что не так элегантно, но работал, должен был сделать sscanf сканировать определенное количество %s-х так:

// scans up to 50 words in a line 
int Read_Words_From_String(char *StringLine, char **StringArray) 
{ 
    return(sscanf(StringLine, "%s%s..//which goes on to the count of 50..%s%s", 
        StringArray[0], // would contain ercode in your case 
        StringArray[1], 
        : // which goes on to the count of 50 
        StringArray[49])); 
} 

sscanf возвращает количество слов сканируемых нем может использоваться как счетчик циклов для обработки их в другой формат строки.

+0

Why_Do_You_Write_Your_Subroutines_Like_This? –

+0

Это фактическое имя функции устаревшего кода. – Keugyeol

+0

Oh_Okay. That_Makes_Sense_Now –

0

Вот версия, которая должна работать для линий, длина которых почти равна BUFSIZ.

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

int main(int argc, char** argv) 
{ 
    char token[10]; 
    char rest[BUFSIZ]; 

    FILE* in = fopen(argv[1], "r"); 
    if (in == NULL) 
    { 
     return EXIT_FAILURE; 
    } 

    // Explanation of the format: 
    // %9s  Read at most 9 characters into a string 
    // %[^\n] Read all characters until '\n' into a string 
    // %*c  Read a character but don't store it. Takes care of 
    //   getting rid of the `\n' from the input stream. 
    while (fscanf(in, "%9s %[^\n]%*c", token, rest) == 2) 
    { 
     printf("%s,%s\n", token, rest); 
    } 

    fclose(in); 
    return EXIT_SUCCESS; 
} 
Смежные вопросы