2009-07-17 4 views
0

getc (stdin) считывает ввод с клавиатуры в целые числа, но что, если я хочу читать ввод с клавиатуры в символьные строки?Как читать ввод с клавиатуры в символьные строки? (C++)

#include "stdafx.h" 
#include "string.h" 
#include "stdio.h" 
void CharReadWrite(FILE *fin); 
FILE *fptr2; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 

    char alpha= getc(stdin); 
    char filename=alpha; 
    if (fopen_s(&fptr2, filename, "r") != 0) 
     printf("File stream %s was not opened\n", filename); 
    else 
    printf("The file %s was opened\n", filename); 
    CharReadWrite(fptr2); 
    fclose(fptr2); 
    return 0; 
} 
void CharReadWrite(FILE *fin){ 
    int c; 
    while ((c=fgetc(fin)) !=EOF) { 
     putchar(c);} 
} 
+0

Во-первых вы можете поместить весь код в виде кода? Также getc возвращает один символ (конкретный целочисленный), поэтому, если вы наберете путь к файлу, нажмите enter, имя файла будет состоять только из первого символа. – DeusAduro

ответ

2

Продолжая тему getc, вы можете использовать fgets, чтобы прочитать строку ввода в буфер символов.

E.g.

char buffer[1024]; 
char *line = fgets(buffer, sizeof(buffer), stdin); 
if(!line) { 
    if(feof(stdin)) { 
     printf("end of file\n"); 
    } else if(ferror(stdin)) { 
     printf("An error occurerd\n"); 
     exit(0); 
    } 
} else { 
    printf("You entered: %s", line); 
} 

Примечание ответ, что ryansstack является гораздо лучше, проще и безопаснее решение, даваемое вы используете C++.

1

Символ (ASCII) представляет собой 8-значное целочисленное значение без знака, т.е. он может иметь значение от 0 до 255. Если вы посмотрите на таблицу ASCII, вы увидите, как значения целых чисел сопоставляются с символами. Но в целом вы можете просто переключаться между типами, а именно:

int chInt = getc(stdin); 
char ch = chInt; 

// more simple 
char ch = getc(stdin); 

// to be explicit 
char ch = static_cast<char>(getc(stdin)); 

Edit: Если вы настроены на использование ЕОКП читать в имени файла, вы можете сделать следующее:

char buf[255]; 
int c; 
int i=0; 
while (1) 
{ 
    c = getc(stdin); 
    if (c=='\n' || c==EOF) 
     break; 
    buf[i++] = c; 
} 
buf[i] = 0; 

Это способ довольно низкий уровень чтения входов символов, остальные ответы дают более высокие/безопасные методы уровня, но опять-таки, если вы установите на GETC ...

+0

getc возвращает 'int' по какой-то причине. 'EOF' обычно не будет вписываться в' char'. –

+0

Вы бы посмотрели вышеприведенный код? Я всегда получаю сообщения об ошибках, когда пытаюсь скомпилировать их – user133466

+0

. Хорошая точка, поэтому, чтобы быть уверенным, убедитесь, что возвращаемое значение не является EOF, прежде чем кастинг на символ. – DeusAduro

0

Поскольку вы уже смешиваете код «C» с «C++» с помощью printf, почему бы не продолжить и использовать scanfscanf("%s", &mystring);, чтобы читать и форматировать все это красиво?

Или, конечно, что уже было сказано .. getline

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