2012-03-27 165 views
1

從一個* .txt文件讀取數字我有一個* .txt文件,每行有一個整數。所以文件看起來像使用fstream從C++的* .txt文件讀取數字使用fstream

103123 
324 
4235345 
23423 
235346 
2343455 
234 
2 
2432 

我想從一個文件行逐行讀取這些值,所以我可以把它們放在一個數組中。下面是一些代碼,我寫了實現這一

#include "stdafx.h" 
#include <iostream> 
#include <fstream> 
#include <string> 

using namespace std; 

int nArray[1000]; 
int i = 0; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    ifstream file("C:\Users\Chinmay\Documents\Array.txt"); 
    //fstream file("C:\Users\Chinmay\Documents\Array.txt", ios_base::out); 
    //fstream file(); 
    //file.open("C:\Users\Chinmay\Documents\Array.txt", ios_base::out); 

     bool b = file.is_open(); 
    //file.seekg (0, ios::beg); 
    int i = file.tellg(); 
    while(!file.eof()) 
    { 
     //string str; 
     //getline(file, str); 
       //nArray[i++] = atoi(str.c_str()); 
     char str[7] = {}; 
     file.getline(str,7); 
     nArray[i++] = atoi(str); 
    } 
    file.close(); 
    return 0; 
} 

該文件打開爲布爾「B」返回true。但while循環在一次運行中退出。數組是空的。我在網上看了起來,試了試其他像這裏給出的代碼在

code tutorial

#include "stdafx.h" 
#include <iostream> 
#include <fstream> 
#include <string> 

using namespace std; 

int nArray[100000]; 
int i = 0; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    ifstream in("C:\Users\Chinmay\Documents\Array.txt"); 
    bool b = in.is_open(); 

    if(!in) { 
    cout << "Cannot open input file.\n"; 
    return 1; 
    } 

    char str[255]; 

    while(in) { 
    in.getline(str, 255); // delim defaults to '\n' 
    if(in) cout << str << endl; 
    } 

    in.close(); 

    return 0; 

} 

這將立即返回爲好。文件打開但沒有讀取數據。該文件不是空的,並有數據。有人能解釋我要去哪裏嗎?我正在使用Visual Studio 2011測試版。

+2

你爲什麼不使用'int tmp; cin >> tmp'並將結果存儲在'std :: vector'或'std :: list'中? – 2012-03-27 00:45:54

+2

'std :: vector '確實是你的朋友。 'int nArray [100000];'可能會非常浪費記憶。 – 2012-03-27 00:49:59

+0

我同意使用std :: vector而不是在堆棧上分配數組。這只是一個初稿,我只是試圖從文件中讀取部分權利。我也會嘗試尼克拉斯B的建議。儘管爲什麼fstream和fstream.getline()不起作用,但仍然好奇。謝謝。 – 2012-03-27 01:07:55

回答

2

這不是做你覺得它在做什麼:

ifstream file("C:\Users\Chinmay\Documents\Array.txt"); 

使用正斜槓(甚至在Windows上),並檢查文件立即打開成功:

std::ifstream ifs("C:/Users/Chinmay/Documents/Array.txt"); 
if (!ifs) 
{ 
    // Failed to open file. Handle this here. 
} 
-1

這是一個代碼不錯位 http://www.java2s.com/Code/Cpp/File/readingatextfile.htm
如果這適用於您的文件,然後簡單地添加你的任務

nArray [我++] =的atoi(線);在cout之後。


如果它仍然有效,那麼請註釋該cout ..可能會很好地將它留在那裏註釋掉,因爲它可能會向您的老師顯示您的過程。有些PROFS只是想看到成品,所以這是給你

+0

哦..確保在啓動while循環之前將i設置爲零。 – baash05 2012-03-27 01:51:31

+1

這段代碼很糟糕。 [它錯誤地處理EOF。](http://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-considered-wrong) – Blastfurnace 2012-03-27 02:55:08

+0

@Blastfurnace現在完全看到它..把讀在while()中,它會很好。 – baash05 2012-05-11 04:15:33

0

我看不出有什麼太大錯誤的第二個版本。

然而,在第一個版本,你調用file.getline(str,7);其中線有時會包含一個7位數。直到讀取分隔符(默認爲'\n')或讀取了6個字符爲止,在這種情況下設置了failbit

因爲您只在while循環中測試eof,所以它不會退出。

如果將上述行中的getline調用和char數組聲明中的7更改爲8,則應該起作用。

所有的說法,@尼克拉斯B的建議使用int tmp; file >> tmp;和存儲在vector可能是最簡單的解決方案。