2016-08-06 4 views
0

Я пытаюсь прочитать символ текстового файла по символу. Я использую строку для чтения файла. Мой код для чтения файла ниже:не может установить std :: string, равную нулевому индексу другой std :: string

int main() 
{ 
    std::ifstream data; 
    data.open("C:\\Users\\Christian Dean\\Documents\\CodeLiteWorkspace\\CplusplusPractice\\src\\test_file.qz"); 
    std::string data_str; 
    int counter = 0; 
    data >> data_str; 
    for(int i = 0; i < data_str.length(); i++) 
    { 
     std::string tokenizer = data_str[i]; 
     if (tokenizer == "output") 
     { 
      counter++; 
     } 
    } 
    std::cout << counter << std::endl; 
    data.close(); 
    return 0; 
} 

, как вы можете видеть, в моем цикл я устанавливаю строку tokenizer равной индекса нулевой строки data_str. Однако при компиляции он показывает ошибку

`main.cpp:27:37: error: invalid conversion from 'char' to ''const char*' [-fpermissive].

Я действительно не знаю, как еще я могу прочитать символ файла по символу. Я попытался установить tokenizer как тип char. Но когда я запускаю программу, она говорит, что переменная counter равна 0. Таким образом, очевидно, что переменная tokenizer типа char не работала.

Содержание текстового файла ниже, если это необходимо:

output: "Hello World 
+0

Опишите, что вы хотите сделать, так как я не вижу, как чтение символа по символу когда-либо приводит к строке 'output' в' tokenizer', если 'tokenizer' содержит только один символ за раз. – Yakk

+0

Чтобы развернуть комментарий Якка, прогуливая вход по одному символу за раз, вы никогда не сможете увидеть целое слово. Если вместо этого вы извлекли строки до тех пор, пока 'data.eof()' не вернётся, вы будете ходить каждое слово в файле, которое вы могли бы сравнить и считать против – nate

+0

. Не уверен, что я неправильно понимаю, что задумал его комментарий, но бойтесь loop to eof. Подробнее здесь: http://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-considered-wrong – user4581301

ответ

3
std::string data_str; 

определяет std::string.

std::string tokenizer = data_str[i] 

определяет std::string и пытается построить string с помощью одного символа. std::string не имеет конструктора, который принимает один символ.

Поскольку вы собираетесь сравнить эту одиночную строку символов со всем словом, это не то, что вы хотите сделать в любом случае.

data >> data_str; 

читает в промаркированном разделительном знаке - фактически одно слово плюс любые знаки препинания.

так

while (data >> data_str) 
{ 
    stripPunctuation(data_str); 
    if (data_str == "output") 
    { 
     counter++; 
    } 
} 

stripPunctuation будет выглядеть void stripPunctuation(std::string & input) и удалит все знаки препинания, но я включил только, что хак как упрощенный пример. Этот подход будет работать, но лучшее решение - это что-то вроде changing the delimiter for cin (c++), чтобы добавить все знаки пунктуации, которые вы хотите разбить, и пусть >> выполнит эту работу за вас.

Тогда вы получите

// configure stream to treat punctuation as whitespace here 
while (data >> data_str) 
{ 
    if (data_str == "output") 
    { 
     counter++; 
    } 
} 

и вы сделали.

+0

Это не оператор =. 'std :: string foo = blah;' не включает 'operator =' в любом месте. – Yakk

+0

Gah. Это будет конструкцией. Починю. – user4581301

1

Попробуйте

std::string tokenizer = std::string(1, data_str[i]); 

std::string не имеет конструктор, который принимает один char. Однако используемая нами перегрузка конструктора принимает во втором аргументе char и создает std::string, содержащий повторение длины char длины, заданной первым аргументом.

+4

демонстрирует, почему это не будет компилироваться, но не пытается направлять OP в полезное решение. – user4581301