2015-09-02 74 views
1

目前我剛剛開始使用C++,並希望深入瞭解文件I/O,以便搜索一些隨機代碼並鍵入它以查看它是否有效以及它的工作方式。但我遇到了一些我自己無法理解的問題。關於文件I/O的疑問

#include <fstream> //for file processing 
#include <iostream> 
#include <vector> 
#include <string> //to_string 

using namespace std; 

int main (int argc, char *argv[]) 
{ 
    if (argc != 3) 
{ 
    cerr << "Incorrect number of arguments" << endl; 
    return 1; 
} 
//open file at argv[1] (should be our input file) 
ifstream inputFile (argv[1]); 
ofstream outputFile (argv[2]); 

// check if file opening succeeded 
if (!inputFile.is_open()) 
{ 
    cerr << "Could not open the input file\n"; 
    return 1; 
} 
else if(!outputFile.is_open()) 
{ 
    cerr << "Could not open the output file\n"; 
    return 1; 
} 
//declare a vector of integers 
vector<int> numbers; 

int numberOfEntries; 

//get the first value in the inputFile that has the number of elements in the file 
inputFile >> numberOfEntries; 

//iterate through the inputFile until there are no more numbers 
for(int i = 0; i < numberOfEntries; ++i) 
{ 
    //get next number from inputFile 
    int number; 
    inputFile >> number; 

    //store number in the vector 
    numbers.push_back(number); 
} 

//iterate through the vector (need c++11) 
for(int n : numbers) 
{ 
    //write to the output file with each number multiplied by 5 
    outputFile << (n*5); 

    //add a line to the end so the file is readable 
    outputFile << "\n"; 
} 
return 0; 
} 

所以我有這段代碼,我編譯它。它只會顯示我Incorrect number of arguments。出了什麼問題?

+0

哇,我永遠不會試圖學習這樣的東西。 – john

回答

3

Spidey是正確的,但是,當你開始像這樣編程時,閱讀代碼並將其分解成可以理解的部分是很重要的。

#include <fstream> //for file processing 
#include <iostream> 
#include <vector> 
#include <string> //to_string 
using namespace std; 

您應該認識到這些包含指令 - 使用與I/O相關的庫,就像您期望的那樣。

int main (int argc, char *argv[]) 
{ 
    if (argc != 3) 
{ 
    cerr << "Incorrect number of arguments" << endl; 
    return 1; 
} 

這是引發錯誤的地方。 argc正在檢查提供給應用程序的參數數量 - 如果該數字不是3,程序將返回一條消息並退出,結果爲1 - 成功的程序通過比較總是返回0

我們可以仔細檢查通過分析接下來的幾行這樣的假設:

//open file at argv[1] (should be our input file) 
ifstream inputFile (argv[1]); 
ofstream outputFile (argv[2]); 

看到了嗎?它正在檢查在參數位置[1][2]提供的文件 - 我們最初的假設是正確的。該程序需要在命令行提供多個文件;沒有它們就無法運行。所以當程序意識到它沒有合適數量的文件時會提前退出。

// check if file opening succeeded 
if (!inputFile.is_open()) 
{ 
    cerr << "Could not open the input file\n"; 
    return 1; 
} 
else if(!outputFile.is_open()) 
{ 
    cerr << "Could not open the output file\n"; 
    return 1; 
} 

這些線將嘗試打開這些文件,並提前返回的錯誤信息並退出,如果他們不能打開(例如,如果不存在的話)。

//declare a vector of integers 
vector<int> numbers; 

int numberOfEntries; 

//get the first value in the inputFile that has the number of elements in the file 
inputFile >> numberOfEntries; 

//iterate through the inputFile until there are no more numbers 
for(int i = 0; i < numberOfEntries; ++i) 
{ 
    //get next number from inputFile 
    int number; 
    inputFile >> number; 

    //store number in the vector 
    numbers.push_back(number); 
} 

//iterate through the vector (need c++11) 
for(int n : numbers) 
{ 
    //write to the output file with each number multiplied by 5 
    outputFile << (n*5); 

    //add a line to the end so the file is readable 
    outputFile << "\n"; 
} 

此代碼遍歷inputFile,尋找數字,並將它們輸出到outputFile

所以現在我們知道這整個程序是從一個文件讀取數字並寫入另一個文件的練習。這是一個簡單的I/O示例。

return 0; 

記得當我說成功的程序返回0?那麼在這裏,所有的代碼運行完畢後,程序就完成了。

編輯:要直接回答你的問題,這個程序需要提供兩個文件作爲文件名。這樣的例子將是g++ -o fileExample fileExample.cpp input.txt output.txt,其中input.txt文件包含數行,並且output.txt被創建,坐落在與input.txtinput.txt相同的位置。 fileExample.cpp

+1

哇非常感謝。我從來沒有想過,有人會這樣打破這一點,並幫助我解決這個問題。我很感激並感謝你的幫助。我絕對從中學到了一些東西。 –

+1

@GoodrichClint沒問題。我們在某個時候都是新手程序員。過了一段時間,您將學習以這種方式分析代碼。我很高興能夠提供幫助。 – Singular1ty

+0

可能你的意思是'g ++ -o fileExample fileExample.cpp' [Enter]'./fileExample input.txt output.txt'? – bcrist

0

您尚未指定正確數量的參數。發佈你在編譯之前輸入的內容。 (編輯:我說的關於該程序的實際功能是錯誤的,我通過哈哈掠過,上面的夥計總結了這一切更好)。

+0

那麼這個代碼實際上會起什麼作用?創建一些文件並操作它們? –

+0

它希望你給它2個文件,它會顯示每個文件中的條目數量。如果(argc!= 3){...}意味着如果沒有確切的3個參數,程序將退出。 – Spidey

+0

會像g ++ -o helloworld helloworld.cpp file1.txt file2.txt – Spidey