2013-06-04 8 views
3

Я написал простую программу (C++), которая принимает 20 чисел и сортирует их в порядке возрастания. Теперь я хочу сохранить действия в программе в файле типа num.txt. Можете ли вы объяснить мне, какие изменения я должен сделать?C++: Сохранение текстового файла

#include <iostream> 
#include <iomanip> 
#include <conio.h> 
using namespace std; 

int main() { 

    int x[21], s; 
    int j,i; 

    for (int i = 1; i < 21; i++) 
    { 
     cout << setw(11) << i << ": "; 
     cin >> x[i]; 
    } 
    for (int i = 1; i < 21; i++) 
    { 
     for (int j = i+1; j < 21; j++) 
     { 
      if (x[j] < x[i]) 
      { 
       s = x[j]; 
       x[j] = x[i]; 
       x[i] = s; 
      } 
     } 
    } 

    cout << endl; 
    for (int i = 1; i < 21; i++) 
    { 
     cout << i << ": "; 
     cout << x[i] << "\t"; 
     if (i % 5 == 0) 
     { 
      cout << endl; 
     } 
    } 
    getch(); 
    return 0; 
} 

Я знаю, что это просто, но я только начал с тех пор, как несколько дней назад, и я новичок.

ответ

2

Если вы запускаете вашу программу из командной строки, введите следующую команду (при запуске), чтобы направить вывод в файл:

myApp > num.txt 

вы можете также использовать переключатель <, чтобы указать файл, чтобы получить ввод от слишком

You can find more information here.

+0

Хотя связь предоставленной UNIX конкретной ее стоит отметить что этот подход будет отлично работать в Windows под 'cmd.exe' и PowerShell. – DuncanACoulter

+0

Это хороший подход, но на самом деле он не очень хорошо подходит, если есть какой-либо вывод, отличный от списка чисел. Если OP добавляет какие-либо подсказки или сообщения об ошибках, они никогда не будут видны с тех пор, как они будут перенаправлены в выходной файл. –

4

использовать это в вашем коде

#include <fstream> 

ofstream outputFile; 
outputFile.open("outputfile.txt"); 
outputFile << value << endl; 
outputFile.close(); 
3

Одним из решений является использование ofstream (в «fstream.h», очень похожий на станд :: соиЬ):

ofstream out("num.txt"); 
if (out.is_open() == false) 
{ 
    cout << "Error! Couldn't open file!" << endl; 
} 
else 
{ 
    out << "\n"; 
    for (int i = 1; i < 21; i++) 
    { 
     out << i << ": "; 
     out << x[i] << "\t"; 
     if (i % 5 == 0) 
     { 
      out << "\n"; 
     } 
    } 
    out.close(); 
} 
+2

Он отметил этот 'C++' и использовал ввод-вывод типа C++ для печати на стандартную версию. Поэтому кажется немного глупым предложить ему C-style I/O. –

+0

добавлен ввод/вывод в стиле C++ с использованием fstream. – user2448027

+0

Я предлагаю полностью удалить стиль C типа. Это решение да, но может привести ОП вниз по пути, который они не должны путешествовать. –

5

Для вывода числа в файл вы можете использовать std::ofstream для вывода поток и замените cout с именем переменной, которое вы используете для потока.

std::ofstream outfile; 
outfile.open("num.txt"); 
for (int i = 1; i < 21; i++) 
{ 
    outfile << i << ": "; 
    outfile << x[i] << "\t"; 
    if (i % 5 == 0) 
    { 
     outfile << std::endl; 
    } 
} 
outfile.close(); 

Вы также можете взять его на шаг дальше и добавить входной проверки и использовать компоненты из стандартной библиотеки для обработки большинство того, что вы пытаетесь достичь. Например, вместо хранения чисел в массиве я предлагаю вместо этого использовать std::vector. Вы также можете использовать std::sort для сортировки данных вместо их реализации.

#include <vector>  // vector 
#include <fstream>  // fstream 
#include <algorithm> // sort 
#include <iostream> 

int main() 
{ 
    std::vector<int> numbers; 

    while(numbers.size() != 20) 
    { 
     int value; 

     if(!(std::cin >> value)) 
     { 
      std::cout << "you must enter a number" << std::endl; 
     } 
     else 
     { 
      numbers.push_back(value); 
     } 
    } 

    // Do the sort. Pretty easy huh! 
    std::sort(numbers.begin(), numbers.end()); 

    std::ofstream outfile; 
    outfile.open("num.txt"); 
    if(outfile.is_open() == false) 
    { 
     std::cout << "Unable to open num.txt" << std::endl; 
    } 
    else 
    { 
     for(size_t i = 0; i < numbers.size(); i++) 
     { 
      outfile << i << ": "; 
      outfile << numbers[i] << "\t"; 
      if (i % 5 == 0) 
      { 
       outfile << std::endl; 
      } 
     } 
     outfile.close(); 
    } 
} 
+0

Приятно, хотя вам может потребоваться упростить вывод. Если числа в файле - все, что требуется, то 'for (int nbr: numbers) {outfile << nbr << std :: endl; } 'достаточно (C++ 11 for-loop) – stefaanv

+0

Я считал диапазон, основанный на циклах, но чувствовал, что больше подходит к компонентам в стандартной библиотеке, будет достаточно для обработки;) Кроме того, OP, похоже, хочет напечатать 5 номеров за чтобы выполнить некоторую дополнительную обработку. Я подумал о добавлении перегрузки для 'operator <<', взяв «вектор» на RHS только для хихиканья. –

+0

спасибо. так полезно. – amir

2

здесь ваш код со всеми изменениями теперь вы просто должны скопировать пасту (я сделал комментарий по линии я добавил)

#include <iostream> 
#include <iomanip> 
#include <conio.h> 
#include <fstream>//file stream 

using namespace std; 

int main() { 

    int x[21], s; 
    int j,i; 

    for (int i = 1; i < 21; i++) 
    { 
     cout << setw(11) << i << ": "; 
     cin >> x[i]; 
    } 
    for (int i = 1; i < 21; i++) 
    { 
     for (int j = i+1; j < 21; j++) 
     { 
      if (x[j] < x[i]) 
      { 
       s = x[j]; 
       x[j] = x[i]; 
       x[i] = s; 
      } 
     } 
    } 

    ofstream out; //output file stream 
    out.open("num.txt"); //opening (and creating output file named out 


    //cout << endl; 
    for (int i = 1; i < 21; i++) 
    { 
     //cout << i << ": "; 
     out << i << ": "; //printing in output file 
     // cout << x[i] << "\t"; 
     out << x[i] << "\t"; //printing in output file 
     if (i % 5 == 0) 
     { 
      //cout << endl; 
      out << endl; //printing in output file 
     } 
    } 
    //getch(); 
    out.close(); //closing output file 
    return 0; 
} 
+0

Большое спасибо. – amir

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