Как читать в файле, содержащем пробел и пунктуацию?

У меня проблемы с чтением в файле, который содержит пробел и пунктуацию. я использую inFile >> letter читать полукокса и число. Когда я читаю файл, который является пробелом или пунктуацией, это останавливает чтение текстового файла.

Вот текстовый файл, который мне нужно прочитать

a 31
12
e 19
i 33
o 41
u 11
, 2

Код:

char letter;
int num;

inFile.open(FILENAME.c_str());
if(inFile.fail())
cout << "Error..." << endl;
while (inFile >> letter){
inFile >> num ;
}
inFile.close();

Может кто-нибудь сказать мне, как это исправить?

Спасибо

0

Решение

Я скомпилировал этот код (MSVC2012):

char letter;
int num;
std::fstream inFile;

inFile.open("1.txt");
if(inFile.fail())
{
cout << "Error..." << endl;
}
while (inFile >> letter)
{
inFile >> num ;
std::cout << letter << " | " << num << std::endl;
}
inFile.close();

И получите этот вывод:

a | 31
1 | 2
e | 19
i | 33
o | 41
u | 11
, | 2

Если у вас есть другой компилятор, и он прекращает синтаксический анализ, вы можете использовать std :: getline и попробовать использовать std :: stringstream:

char letter;
int num;
std::fstream inFile;

inFile.open("1.txt");
if(inFile.fail())
{
cout << "Error..." << endl;
}
while (!inFile.eof())
{
std::string line;
std::getline(inFile, line);
std::stringstream stream(line);
stream >> letter >> num;
std::cout << letter << " | " << num << std::endl;
}
inFile.close();

Но проблема все еще возникает, если в начале строки есть пробел. Чтобы избежать этого, вы должны разбить строку на пробелы и проанализировать части по stringstream или atoi

0

Другие решения

использование getline вместо этого и анализируйте текст по своему усмотрению.

#include <iostream>
#include <string>

using namespace std;

int main()
{
string line;

while (cin)
{
getline(cin, line);
string col1 = line.substr(0, 1);
string col2 = line.substr(2);

char letter = ' ';
int  num    = -1;

if (!col1.empty())
letter = col1[0];
if (!col2.empty())
num = stoi(col2);

cout << letter << "/" << num << '\n';
}
}
0

По вопросам рекламы [email protected]