2017-02-22 15 views
-3

нерабочего кода:Проблем с ifstream чтение данных CSV

#include<iostream> 
#include<fstream> 
#include<string> 
int main(){ 
int id; string name;char comma ; double money; 
ifstream read("testfile.csv"); 
while (read >> id >> comma>> name >> comma >> money) 
{cout << id <<comma<<name<<comma<<money<< endl ;} 
read.close(); 
_getch(); 
return 0;} 

CSV-файл данные & структуры:

1,user1,999 2,user2,33 3,user3,337

Но, следующие прекрасно работает. Почему так?

while (read >> id >>comma>>name) {cout << id<<comma<<name <<endl ;}

+0

Хорошее чтение: http://stackoverflow.com/questions/1120140/how-can-i-read-and-parse-csv-files-in-c – NathanOliver

+0

@NathanOliver благодарит, пытался выяснить, почему сработали альтернативные коды. – CowardlyDog

ответ

3

Когда вы читаете строку, используя >>, он читает пробелами строку. Если в прочитанном тексте нет пробела, он будет читаться до конца строки (поскольку новая строка - это пробел).

Из-за этого «синтаксический разбор» ввода будет немного не синхронизирован с содержимым из файла и приведет к ошибке при попытке прочитать один из чисел.

+0

+1 - где найти/узнать следующую информацию? ** Когда вы читаете строку с помощью >>, она считывает строку с разделителем пробела ** **, поскольку новая строка - это пробел ** – CowardlyDog

+0

@CowardlyDog Для большей информации я обычно перехожу к [этой ссылке wiki] (http: // en.cppreference.com/w/cpp). Ссылка [input/output reference] (http://en.cppreference.com/w/cpp/io) имеет, конечно, раздел в ['std :: basic_istream'] (http://en.cppreference.com/w/cpp/io/basic_istream) (который является базовым классом для всех входных потоков), который, в свою очередь, имеет ссылки на [in-class member 'operator >>' overload] (http://en.cppreference.com/w/ cpp/io/basic_istream/operator_gtgt), а также [un-member 'operator >>' overloads] (http://en.cppreference.com/w/cpp/io/basic_istream/operator_gtgt2) (используется для строк). –

+1

@CowardlyDog [Продолжение ...] Для чтения строк последняя ссылка содержит текст «Экстракция останавливается, если выполняется одно из следующих условий: ... найден символ пробела ...». Ergo, строки чтения разделены пробелами. :) –