2016-05-15 7 views
0

Я хотел бы написать программу лотереи на C, которая читает выбранные числа прошлых недель в массив. У меня есть текстовый файл, в котором есть 5 столбцов, разделенных табуляторами. Мои вопросы будут следующими:Как правильно читать числа из текстового файла?

  • С чем я должен разделять столбцы? (например, запятая, точка с запятой, табулятор или что-то еще)
  • Должен ли я включать вид EOF в последней строке? (например, -1, «EOF»). Есть ли принятое или «официальное» соглашение для этого?
  • Какую функцию я должен использовать для считывания чисел? Есть ли какой-либо правильный или «приемлемый» способ чтения данных из текстовых файлов?

Я использовал для написания программы для «Кто хочет стать миллиардером». В этом я использовал какую-то функцию, которая читала каждую строку в массив, который был достаточно большим, чтобы удерживать целую строку. После этого я разделила свои данные в переменные, как это:

line: "text1";"text2";"text3";"text4"endline (-> line loaded into a buffer array) 
text1 -> answer1 (until reaching the semicolon) 
text2 -> answer2 (until reaching the semicolon) 
text3 -> answer3 (until reaching the semicolon) 
text4 -> answer4 (until reaching the end of the line) 
endline -> start over, that is read a new line and separate its contents into variables. 

Он работал должным образом, но я не знаю, если он был достаточно хорош для программиста. (кстати, я еще не программист, изучаю компьютерные науки в университете)

Все ответы и советы приветствуются. Заранее благодарим за вашу любезную помощь!

+0

Хотя «табуляторы» были основой для «вкладок», а Unicode определяет U + 0009 HORIZONTAL TABULATION и U + 000B VERTICAL TABULATION, большинство людей будут писать «вкладки» или «табуляторы», а не «табуляторы» или «табуляции», (используя «вертикальную вкладку» для U + 000B). –

+0

colons ':' или точки с запятой ';' делают отличные разделители для числовых данных. Предложите не использовать 'tabs', поскольку они, как правило, затрудняют чтение данных для людей, поскольку они не всегда легко видны при просмотре текстового файла. Строго предположите, что каждая группа чисел будет разделена с помощью новой строки '\ n'', потому что тогда можно прочитать всю строку, используя вызов' fgets() ', и проанализировать строку в памяти с помощью' sscanf() 'или' strtok () ' – user3629249

ответ

3

scanf() Семейство функций не заботится о новых строках, поэтому, если вы хотите обрабатывать строки, вам необходимо сначала прочитать строки, а затем обработать строки с помощью sscanf(). Семейство функций scanf() также обрабатывает пробелы - пробелы, вкладки, символы новой строки и т. Д. - взаимозаменяемо. Использование вкладок в качестве разделителей в порядке, но пробелы тоже будут работать. Очевидно, что если вы читаете и обрабатываете строку за раз, новые строки не будут влиять на сканирование.

int lottery[100][5]; 
int line; 
char buffer[4096]; 

for (line = 0; fgets(buffer, sizeof(buffer), stdin) != 0 && line < 100; line++) 
{ 
    if (sscanf(buffer, "%d %d %d %d %d", &lottery[line][0], &lottery[line][1], 
       &lottery[line][2], &lottery[line][3], &lottery[line][4]) != 5) 
    { 
     fprintf(stderr, "Faulty line: [%s]\n", line); 
     break; 
    } 
} 

Это останавливается на EOF, слишком много линий, и неисправной линии (тот, который не начинается с 5 номеров, вы можете проверить их значения и т.д. в цикле, если вы хотите - но то, что тесты вам нужно бежать?). Если вы хотите проверить разделители пробелов, вам придется усердно работать.

Возможно, вы хотите проверить только пробелы и символы новой строки после 5 чисел; это немного сложнее (это можно сделать, посмотрите в спецификации преобразования %n в sscanf()).

+0

Мало: предложите' line <100 && fgets (buffer, ... 'как не читать и отбрасывать входные данные после 100 строк .. – chux

+1

@chux: Интересный момент. Это может зависеть от того, 100 строк в файле (стандартный ввод), если это так, как написано, оно попадает в EOF, прежде чем проверять, есть ли место. Если вы не возражаете, что есть больше данных для чтения, тогда ваше право, что проверка индекса сначала будет лучше. Как вы сказали «второстепенный», и вы можете сделать аргумент в любом случае - ретроспективно, проверьте индекс, прежде чем ввод, вероятно, станет лучшим общим расположением. –

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