2016-10-12 1 views
1

Я пытаюсь использовать fscanf читать из INFILE (который является либо STDIN или файл) для файла, который представлен как это:Чтение в виде текстового файла с запятой-х

1,2,3 
4,5,6 

ли игнорировать тот факт, что они - числа - я представляю их как строки.

То, что я сделал, я использовал

fscanf(infile, "%s%*c %s%*c %s%*c[^\n]", x, y, z); where x, y, z are string variables. 

Я ожидаю, что каждый представляет собой цифру, на этой линии, сохраняется в х, у, г, но она не работает, и вместо того, чтобы хранить цельные строка в x одна.

Любая помощь пожалуйста? Благодарю.

+0

Есть много инструментов для проверки регулярных выражений: http://www.freeformatter.com/regex-tester.html – Asaf

+2

@Asaf 'scanf' не использует регулярные выражения. – jamesdlin

+0

Вам, вероятно, лучше всего читать целую строку с 'fgets' (или' getline', если она доступна) и символизировать ее с помощью 'strtok'. 'scanf' (и' fscanf'), как правило, трудно использовать правильно. – jamesdlin

ответ

1

Вы используете '% s', который будет читать целое слово до пробелов. Таким образом, 1,2,3 читается в x для первой строки.

Что вам нужно сделать, это принять x, y и z как целые числа, тогда вы можете прочитать три целых числа и преобразовать его в строку, используя различные методы (например itoa

int x,y,z; 
char x_str[20], y_str[20], z_str[20]; 
//... 
fscanf(infile, "%d,%d,%d", x, y, z); 
itoa{x,x_str,10); // and so on 
+0

Без потери обобщения z на самом деле является строкой, это строка слов и чисел. – TimelordViktorious

+0

В этом случае вы можете использовать 'fscanf (infile,"% d,% d,% s ", x, y, z_str);' для чтения строки файла. 'z_str' является строкой и непосредственно считывается. –

0

Если вы сусло использование scanf/fscanf, то вы хотите использовать %[^,] в качестве входного форматировщика вместо %s%s будут жадно читать столько, сколько он может;. %[^,] прочтет строку, состоящую из символов (Включая пробелы), которые не являются ,:

fscanf(infile, "%[^,],%[^,],%[^,]", x, y, z); 

Обратите внимание, что выше использование fscanf является небезопасный, потому что не делает ничего, чтобы ограничить количество символов для чтения в каждой строке. Следовательно, он полностью восприимчив к атакам с переполнением буфера.


Лично я бы прочитал всю строку с fgets (или getline, если таковой имеется), а затем разметить его на , с strtok. scanf/fscanf are notoriously hard to use correctly и, как правило, следует избегать.

+0

Если он находится в формате OP (x, y, z \ n), вам нужно что-то вроде '"% [^,],% [^,],% [^ \ n] "', возможно, с пробелы после запятых. Который, я думаю, только делает ваш пункт :) – rici

Смежные вопросы