2016-12-27 5 views
0

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

#include <stdio.h> 
#include <stdlib.h> 
#include <conio.h> 
#include <ctype.h> 

int main() 
{ 
int chr,i; 
FILE *fp; 
fp = fopen("DATA.txt" , "r"); 

do 
{ 
    chr = fgetc(fp); 
    chr = toupper(chr); 
    printf("%c" , chr); 

    if (chr==' ') 
     { 
      getch(); 
     } 

} while(chr!=EOF); 

fclose(fp); 
} 
+0

почему у вас есть эта строка 'Геч();'? –

+1

просто для того, чтобы увидеть медленный поток программы, ничего больше –

+1

Отладчик будет лучше –

ответ

3

... как сосредоточиться на первом письме ... (?)

Detect первую букву каждого слова, сохранив предыдущий персонаж. Пусть слово имеет 1) любую последовательность <white-space><Letter> или 2), если первый прочитанный символ является буквой.

Другие проблемы: EOF обнаружение слишком поздно. Проверить EOF сразу после fgetc()

// EOF test too late 
    chr = fgetc(fp); 
    chr = toupper(chr); 
    printf("%c" , chr); 
} while(chr!=EOF); // too late 

// Instead 
    chr = fgetc(fp); 
    if (chr == EOF) break; 

Все вместе

int previous = ' '; 
while ((chr = fgetc(fp)) != EOF) { 
    if (isspace(previous) && isalpha(chr)) { 
    chr = toupper(chr); // uppercase first letter of every word 
    } 
    printf("%c" , chr); 
    previous = chr; 
} 
1

Предполагая, что вы действительно хотите сделать что ждать после того, как каждое пространство для чтения (предполагаемую причину вашего Геч() там), то вы можете попробовать установить я = 0 до вашего цикла делать. Тогда if (i == 0), то chr = toupper (chr) и приращение i. Наконец, в if (chr == '') снова включите i = 0.

Кроме того, если вы хотите, чтобы рассмотреть другие символы разделительных (переносы, вкладку и т.д.), то вы должны include <ctype.h> и использовать isspace() функцию, как if(isspace(chr)) вместо if(chr == ' ').

2

Это должно сделать трюк

bool upperNext = true; 

while((chr = fgetc(fp)) != EOF) { 
    if(chr == ' ' || chr == '\r' || chr == '\n') { 
     upperNext = true; 
    } else if(upperNext) { 
     chr = toupper(chr); 
     upperNext = false; 
    } 

    printf("%c" , chr); 
} 
+0

@BLUEPIXY вы правы – man