将文本文件读入字符数组。C++ ifstream

6

我想将整个file.txt文件读入字符数组中,但有些问题,请给予建议 =]

ifstream infile;
infile.open("file.txt");

char getdata[10000]
while (!infile.eof()){
  infile.getline(getdata,sizeof(infile));
  // if i cout here it looks fine
  //cout << getdata << endl;
}

 //but this outputs the last half of the file + trash
 for (int i=0; i<10000; i++){
   cout << getdata[i]
 }

或许有人可以建议一种更好的方法将文本文件存储到字符数组中。 - nubme
如果您在任何非玩具应用程序中执行此操作,请确保对无限内存分配进行保护。 - seand
2
你好像漏了一些分号。 - Karl Knechtel
5个回答

7
std::ifstream infile;
infile.open("Textfile.txt", std::ios::binary);
infile.seekg(0, std::ios::end);
size_t file_size_in_byte = infile.tellg();
std::vector<char> data; // used to store text data
data.resize(file_size_in_byte);
infile.seekg(0, std::ios::beg);
infile.read(&data[0], file_size_in_byte);

3
使用 std::string
std::string contents;

contents.assign(std::istreambuf_iterator<char>(infile),
                std::istreambuf_iterator<char>());

1
总是难以记住这个拼写。不太直观。PS. 由于OP请求一个字符数组,contents.c_str()可能会有用。 - gluk47

2

如果你打算将整个文件读入缓冲区,那么就不需要逐行阅读。

char getdata[10000];
infile.read(getdata, sizeof getdata);
if (infile.eof())
{
    // got the whole file...
    size_t bytes_really_read = infile.gcount();

}
else if (infile.fail())
{
    // some other error...
}
else
{
    // getdata must be full, but the file is larger...

}

如果文件大于10000个字符怎么办? - Nawaz
你打算怎么做呢?再声明一个更大的字符数组并重新读取吗?这样是错误的,不是吗? - Nawaz

1
每次读取新的一行时都会覆盖旧的一行。要保持一个索引变量 i,并使用 infile.read(getdata+i,1),然后递增 i。

3
read(..., 1) 每次只读取一个字符...效率非常低下。 - Tony Delroy
infile.seekg(0,ios::end); int len = infile.peekg(); infile.seekg(0,ios::beg); infile.read(getdata,len); - tmiddlet

0

您可以使用Tony Delroy的答案并结合一个用于确定文件大小的小函数,然后创建相应大小的char数组,如下所示:

//Code from Andro in the following question: https://dev59.com/KG025IYBdhLWcg3wtobX

int getFileSize(std::string filename) { // path to file
    FILE *p_file = NULL;
    p_file = fopen(filename.c_str(),"rb");
    fseek(p_file,0,SEEK_END);
    int size = ftell(p_file);
    fclose(p_file);
    return size;
}

然后你可以这样做:

//Edited Code From Tony Delroy's Answer
char getdata[getFileSize("file.txt")];
infile.read(getdata, sizeof getdata);

if (infile.eof()) {
    // got the whole file...
    size_t bytes_really_read = infile.gcount();
}
else if (infile.fail()) {
    // some other error...
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接