2013-04-24 6 views
0

Я пытаюсь найти текстовый файл, используя C для строки символов, которая всегда будет в определенном месте. В частности, я ищу три последовательные тире. Когда он найдет три черточки, он должен вернуть строку, на которой он был найден. Затем он должен продолжить следующую строку и продолжить поиск трех последовательных тире до тех пор, пока не достигнет конца файла. Каждый раз следует распечатать номер строки.Найти строку в текстовом файле в C

Это то, что я до сих пор:

int main() { 
FILE *f; 
char inName[80]; 
printf("Read text from: "); 
scanf(" %79[^\n]s\n", inName); 

f = fopen(inName, "r"); 
if (f == 0) printf("ERROR: Cannot open file %s for reading.\n", inName); 
int lineNumber = 0; 

for(;;) {  
    char line[127]; 
    fgets(line, 127, f); 
    if (!feof(f)) { 
     lineNumber++; 
    } else { 
     break; 
    } 

    double lf; 
    int d, d1; 
    char s[30]; 
    char s1[4]; 

    sscanf(line, " %d, %s, %s, %s, %s, %d, %d, %lf", 
        &d, &s, &s, &s, &s, &d, &s1, &lf); 
    if (s1 == "---") { 
     printf("%d\n", lineNumber); // what line 
    } 
} 
fclose(f); 

return(0); 
} 

Этот код работает, но ничего не печатает. Может ли кто-нибудь показать, как это сделать? Спасибо :)

+0

Вы пробовали отладчик? –

ответ

5

Это не так, как для сравнения строк в C:

if (s1 == "---") 

as сравнивает адрес s1 с адресом строкового литерала "---". Использование strcmp():

if (strcmp(s1, "---") == 0) 
{ 

Всегда проверять возвращаемое значение sscanf() для обеспечения переменных фактически было присвоено значение, прежде чем пытаться использовать их. Символ запятой , не обрабатывается как разделитель при обработке с помощью спецификатора формата "%s", в качестве разделителя используется только пробел. Для того, чтобы предотвратить потребление в , использования набора сканирования, аналогично тому, как вы сделали в начале программы (корректировки заметки на sscanf() аргументы):

if (sscanf(line, 
      " %d, %29[^,], %29[^,], %29[^,], %29[^,], %d, %3[^,], %lf", 
      &d, s,  s,  s,  s,  &d, s1,  &lf) == 8) 
{ 
} 
+0

Обратите внимание, что в строке формата sscanf также есть ошибка; & s1 соответствует% d, когда оно должно быть% s. –

+0

@NigelHarper, я пропустил это, и я пропустил '& s', – hmjd

2

Вы не можете сравнить char[] с ==. Вместо этого используйте strcmp.

if(strcmp(s1, "---") == 0) 
Смежные вопросы