извлечение строки с пробелами из файла в C - PullRequest
1 голос
/ 10 ноября 2009

Нам дали задание, которое включало получение информации из файла и сохранение данных в массиве. Данные в файле сортируются следующим образом

New York            40 43 N    74 01 W

первые 20 символов - это название города, за которым следуют широта и долгота. широта и долгота должны быть легкими с несколькими

fscanf(infile, "%d( или %c в зависимости от того, что я получаю )", pointer)

операций, поэтому они не будут проблемой.

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

Ответы [ 7 ]

1 голос
/ 10 ноября 2009

Вот подсказка: с пробелами в качестве единственного разделителя, как бы вы сказали fscanf(), где начинается название города и начинается широта? Вы приближаетесь к своему «кажется, что это больше используется для чтения всей строки». Изучите это, возможно с fgets().

0 голосов
/ 10 ноября 2009

scanf() может содержать ограниченное количество символов с помощью спецификатора "%c".

ВНИМАНИЕ Он не добавляет завершающий нулевой байт.

char cityname[21];
scanf("%20c%d%d %c%d%d %c", cityname,
      &lat1, &lat2, &lat_letter,
      &lon1, &lon2, &lon_letter);
cityname[20] = 0;

Но вам лучше использовать fgets() и анализировать строку "вручную". В противном случае у вас будут проблемы END-OF-LINE

0 голосов
/ 10 ноября 2009

Из "man fgets":

char * fgets (char * s, int size, FILE * stream);

fgets () считывает не более одного размера символов из потока и сохраняет их в буфер, на который указывает s. Чтение останавливается после EOF или перевод строки. Если читается новая строка, она сохраняется в буфере. '\ 0' сохраняется после последнего символа в буфере.

fgets () возвращает s в случае успеха и NULL в случае ошибки или в конце файла происходит, пока символы не были прочитаны.

Это означает, что вам нужен массив символов из 21 символа для хранения строки из 20 символов (21-й символ будет разделителем '\ 0' в конце, а fgets установит его автоматически).

Удачи!

0 голосов
/ 10 ноября 2009

Вы можете указать размер для %c, который будет собирать блок символов указанного размера. В вашем случае, если название города состоит из 20 символов, введите %20c в формате строки scanf.

Затем вы должны поставить терминатор в конце и обрезать строку.

0 голосов
/ 10 ноября 2009

Просто подсказка: прочитайте всю строку в памяти, а затем возьмите первые 20 символов для названия города, затем, скажем, 10 символов для широты и т. Д.

0 голосов
/ 10 ноября 2009

Если у вас есть пробелы в названии вашего города, вам нужно либо использовать разделители, либо задать в поле названия города фиксированную длину. В противном случае попытка разобрать трехзначное название города, например, "Солт-Лейк-Сити", убьет следующее поле.

0 голосов
/ 10 ноября 2009

G'day,

Когда вы сканируете до первого числа, широты, для названия вашего города может быть использовано сканирование не для чисел для первого элемента?

...