2017-07-25 159 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