2013-01-29 2 views
0

Файл содержит список телефонных номеров, в следующем виде:Чтение из файлов в C++

John   23456 
Ahmed  9876 
Joe 4568 

Имена содержат только слова и имена и номера телефонов разделены пробелами. Напишите программу для чтения файла и вывода списка в двух столбцах. Имена должны быть выровнены по левому краю, а номера правы - оправданы.

Мне удалось удалить пробел и отобразить его, но он не может выровнять его на выходе.

#include<iostream> 
#include<fstream> 
#include<conio.h> 
using namespace std; 
main() 
{ 
    fstream file,f2; 
    file.open("list.txt",ios::in|ios::out); 
    f2.open("abcd.txt",ios::out); 
    file.seekg(0); 

    char ch,ch1; 
    file.get(ch); 

    while(file) 
    { 
     ch1 = ch; 
     file.get(ch); 

     if(ch == ' ' && ch1 != ' ') 
     { 
      f2.put(ch1); 
      f2.put(' '); 
     } 

     if(ch != ' ' && ch1 != ' ') 
      f2.put(ch1); 
    } 

    file.close(); 
    f2.close(); 
    getch(); 
} 
+2

Это звучит подозрительно, как домашнее задание. – crush

+4

Бьюсь об заклад, вы пришли из C. – Nawaz

+2

Правильно отформатируйте свой код в следующий раз и используйте свой пробел для небес. – jrok

ответ

2

Простейшее просто (не параноик входной проверки формата):

#include <iostream> 
#include <iomanip> 
#include <string> 
#include <fstream> 

int main() 
{ 
    std::ifstream ifs("list.txt"); 

    std::string name; int val; 
    while (ifs >> name >> val) 
    { 
     std::cout << std::left << std::setw(30) << name << 
        std::right << std::setw(12) << val << std::endl; 
    } 
} 

Выход:

John         23456 
Ahmed         9876 
Joe         4568 
+0

Большое спасибо! : D –

+0

Не могли бы вы объяснить мне работу while (ifs >> name >> val)? Как указано имя и номер, присвоенный имени и значению? –

+0

Перегрузка оператора '>>' известна как «оператор извлечения потока» и определена для всех обычных встроенных типов (например, double, int, string). Оператор возвращает исходный поток. Тест на успех ('if (ifs)') работает из-за преобразования в логический тип, который приводит к ошибке, если извлечение завершилось неудачно. Наконец, по умолчанию у C++ ifstream будет установлен флаг 'std :: ios :: skipws', поэтому вам не нужно беспокоиться о пропуске пробелов или новых строк вручную. Надеюсь это поможет. – sehe

0

Вы можете просто установить соответствующие флаги на выходном потоке (f2 является выходной поток в вашем случае). Обратитесь к следующей статье: http://www.cplusplus.com/reference/ios/ios_base/width/

Для примера, замените cout с f2, так как они оба выходных потоков Наследование от ios_base. не

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