2017-07-25 157 views
0

我有關於文件輸出/輸入的問題。 這裏是我的程序:正在讀取和寫入文件C++

#include <bits/stdc++.h> 

using namespace std; 

int main() 
{ 
    FILE * out; 
    out=fopen("tmp.txt", "w"); 
    for(int i=0; i<256; i++) 
    { 
     fprintf(out, "%c", char(i)); 
    } 
    fclose(out); 
    FILE * in; 
    in=fopen("tmp.txt", "r"); 
    while(!feof(in)) 
    { 
     char a=fgetc(in); 
     cout<<int(a)<<endl; 
    } 
    fclose(in); 
} 

這裏是輸出:

0 
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
-1 

爲什麼這麼快就停止? 這是否意味着char(26)EOF? 我怎麼能寫入文件(任何類型)來克服這個問題?
我正在尋找的是一種自由將值(任何範圍,可以是char,int或其他)寫入文件然後閱讀它的方法。

+1

除了無償使用'std :: cout'和(濫用)'std :: endl'這是一個C問題。改變您的控制檯輸出使用'printf'並放入一個C標籤;你會得到更好的答案。在C++中,文件I/O通過'std :: ifstream'和'std :: ofstream'完成。 –

+0

對於C++中的文件I/O,您可能需要使用[std :: ifstream和std :: ofstream](http://www.cplusplus.com/doc/tutorial/files/) – HatsuPointerKun

+3

您不應該使用'char '返回'fgetc'。它的返回類型是「int」。你返回'-1'意味着你讀的字符很可能是字符'0xFF'。 'EOF'通常被定義爲整數'-1'。你不能以當前的形式區分它們。 – Lanting

回答

2

Works for me *),但幾句話:

  1. 你不應該使用#include <bits/stdc++.h>,這是用於編譯器的使用,不包括從客戶端應用程序的內部頭。
  2. 由於某些字符在文本(默認)模式下被翻譯(例如EOL)或專門解釋,您應該以二進制模式打開文件。
  3. 讀數(簽字)char和轉換爲int將導致在過去的127
  4. 作爲fgetc已經返回INT負值,你其實並不需要做的是轉換爲符號的字符和背部都沒有。

請看這裏the code with the corrections

*)很明顯,在文本模式下的其他註釋it might not work on Windows中提到(請參閱第2點)。

+0

OP的代碼不適用於Windows,只適用於Linux,也可能適用於其他Unix愛好者。 –

+0

@MichaelWalz是的,在其他評論中注意到它可能無法在Windows下工作,更新了答案。 – axalis

2

我在尋找的是一種自由將值(任何範圍,可以是char,int或sth else)寫入文件然後讀取它的方法。

在這種情況下必須:

  • 獨立用分隔符的單個數值,如空間或新行符號。
  • 回讀整數而不是單獨的單獨字符/字節。

最簡單的就是使用C++ std::fstream。例如:

int main() { 
    { 
     std::ofstream out("tmp.txt"); 
     for(int i=0; i<256; i++) 
      out << i << '\n'; 
     // out destructor flushes and closes the stream. 
    } 

    { 
     std::ifstream in("tmp.txt"); 
     for(int c; in >> c;) 
      std::cout << c << '\n'; 
    } 
} 
+0

我知道,但這是內存效率低下 – miszcz2137

+2

@ miszcz2137比較什麼和在哪裏到底? –

+0

即時通訊設法將字符值保存在一個字符中,但您的代碼最多使用四個字符。 – miszcz2137