2014-01-15 4 views
0

Я пишу небольшую программу C для подсчета количества слов, введенных через стандартный ввод, и подсчитываю количество введенных слов, а также среднее число слов в строке. Следующий код отлично работает для файлов, но при вводе ввода в командную строку я могу (по-видимому) сигнализировать только EOF (Ctrl-Z, так как я нахожусь в Windows) на новой строке, которая сбрасывает количество строк. Есть ли способ исправить это? Вот некоторые примеры:Любой способ сигнализировать конец файла без создания новой строки в командной строке/bash?

Программа:

#include<stdio.h> 

main() 
{ 
    int lines = 0, totalCount = 0; 
    float average = 0.0; 
    char newline= ' '; 

    // scanf and throw away the string values 
    while (scanf("%*s%c", &newline) != EOF) 
    { 
     // at least one line exists 
     if (totalCount == 0) 
     { 
      lines++; 
     } 

     // update count 
     totalCount++; 

     // account for any subsequent lines 
     if (newline == '\n') 
     { 
      lines++; 
     } 
    } 

    average = (float) totalCount/lines; 

    printf("%d ", totalCount); 
    printf("%.2f\n", average); 
} 

Это прекрасно работает (файл имеет 313 слов и 35 строк):

< A.exe testfile.txt

313 8,94

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

a.exe

Это испытание

, чтобы увидеть, если это

работы

ладно

^Z

10 2,00

Конец файла добавляет одну строку, чтобы сделать всего 5 строк, в результате чего средние слова на строку выходят на 2.00. Есть ли способ исправить это или это так, как должно быть?

ответ

0

обновление для тех, кто еще ищет для этого решения:

На оболочке Linux/Unix, можно ввести EOF дважды на одной и той же линии, чтобы очистить буфер строки и создавать и EOF на той же линии, как таковой :

Это мой текст, и теперь я буду очищать буфер и сигнал EOF на одной и той же линии^D^D

Однако этот метод не похоже на работу в командной строке Windows, поэтому я все еще там ищу. Я отредактирую, если я получу обновление.

EDIT: Используя вышеописанный метод, вы выбрасываете входной сигнал, если вы не добавляете пробел между последним символом линии и дозорным EOF.

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