2013-03-01 9 views
0

У меня есть файл, где каждая строка выглядит следующим образом:расщепление строки в C

cc ssssssss,n 

где два первых «C являются отдельными символами, возможно, пространством, то пространства после этого, то» S'S являются строка длиной 8 или 9 символов, тогда есть запятая, а затем целое число.

Я действительно нового с, и я пытаюсь выяснить, как поставить это в 4-х раздельных переменных в каждой строке (каждого из первых двух символов, строки и число)

Все предложения ? Я посмотрел на fscanf и strtok, но я не уверен, как заставить их работать для этого.

спасибо.

+2

Так .. C или C++? Вы действительно должны только пометить это языком, который вас интересует. :) – us2012

+0

Если это вопрос C, почему этот помеченный C++? –

+1

Попробуйте ['strtok'] (http://www.cplusplus.com/reference/cstring/strtok/). – sgarizvi

ответ

5

Я предполагаю, что это вопрос C, как следует из вопроса, а не C++, как могут предположить теги.

  1. Читать всю линию.

  2. Использование strchr найти запятой.

  3. Выполняйте все, что хотите, с двумя первыми символами.

  4. Переключить запятую на нуль, обозначая конец строки.

  5. Позвоните по номеру strcpy с четвертого символа, чтобы извлечь часть sssssss.

  6. Позвоните atoi на один символ, где запятая должна была извлечь целое число.

+0

Не могли бы вы объяснить шаг 4, пожалуйста. – user1056805

+0

'char * comma = strchr (string, ',');' ... '* comma = 0;' Итак, теперь вместо 'foo, bar' вы имеете' foo bar', позволяющий копировать часть 'foo'. –

+0

О, я вижу, спасибо! – user1056805

0

Строка представляет собой последовательность символов, которая заканчивается на первом '\0'. Имейте это в виду. То, что у вас в файле, который вы описали, не является строкой.

Я предполагаю, что n - целое число, которое может охватывать несколько десятичных знаков и может быть отрицательным. Если это так, я считаю, что требуемая строка формата - "%2[^ ] %9[^,\n],%d". Вы хотите передать fscanf следующие выражения:

  1. Ваш FILE *,
  2. Строка формата,
  3. массив из 3-х символов беззвучно преобразуется в указатель,
  4. массив из 9 символов бесшумно преобразованный в указатель,
  5. ... и указатель к int.

Сохраните возвращаемое значение fscanf в int. Если fscanf возвращает отрицательный результат, возникает проблема, такая как EOF или некоторая другая ошибка чтения. В противном случае fscanf сообщает вам, сколько объектов оно присвоило значениям. Значение «успех», которое вы ищете в этом случае, равно 3. Все остальное означает неверно сформированный ввод.

Я предлагаю прочитать fscanf manual для получения дополнительной информации и/или для уточнения.

0

fscanf функция является очень мощной и может быть использована, чтобы решить вашу задачу:

  1. Нам нужно прочитать два символа - формат «% с% с».
  2. Затем пропустите пробел (просто добавьте его в строку формата) - «% c% c».
  3. Затем прочитайте строку, пока мы не нажмем запятую. Не забудьте указать максимальный размер строки. Таким образом, формат «% c% c% 10 [^,]». 10 - максимальное количество символов для чтения. [^,] - список разрешенных символов. ^, - означает все, кроме запятой.
  4. Затем пропустите запятую - «% c% c% 10 [^,],».
  5. И, наконец, прочитайте целое число - "% c% c% 10 [^,],% d".
  6. Последний шаг - убедиться, что все 4 токена считаны - проверьте возвращаемое значение fscanf.

Вот полное решение:

FILE *f = fopen("input_file", "r"); 

do 
{ 
    char c1 = 0; 
    char c2 = 0; 
    char str[11] = {}; 
    int d = 0; 

    if (4 == fscanf(f, "%c%c %10[^,],%d", &c1, &c2, str, &d)) 
    { 
     // successfully got 4 values from the file 
    } 
} 
while(!feof(f)); 

fclose(f); 
Смежные вопросы