如何将txt文件存储到字符数组中?



我希望将具有52个字符的文本文件存储到字符数组中,其中没有空格。下面的代码只输出垃圾。如果你能给我一些解决这个问题的建议,我会很感激的。

int main()
{
fstream fin, fout;
int maxSize = 9999; // Max length for text file.
int sizeArray = 0; //Stores length of message.txt file.
char storeCharacter[maxSize]; //Array that stores each individual character.


fin.open("message.txt");
if(fin.fail())
{
cout << "Input file failed to open (wrong file name/other error)" << endl;
exit(0);
}

sizeArray = fileLength(fin, storeCharacter, maxSize); //Assigns size using fileLength function.
cout << sizeArray << endl; 
char txtCharacters[sizeArray];
storeInArray(fin, txtCharacters, sizeArray);

for(int i=0; i<=sizeArray; i++)
{
cout << txtCharacters[i];
}

fin.close();
fout.close();
return 0;
}
int fileLength(fstream& fin, char storeCharacter[], int length)
{
char nextIn;
int i = 0;
fin >> nextIn;
while(!fin.eof())
{
storeCharacter[i] = nextIn;
i++;
fin >> nextIn;
}

return i; //returns the file size.
}
void storeInArray(fstream& fin, char arr[], int length)
{
int i = 0;
char nextIn;

while(!fin.eof() && i!=length )
{
fin >> nextIn;
arr[i] = nextIn;
i++;
}
}

我尝试使用while和for循环将txt文件字符存储到字符数组中。我期待它的工作,因为我做了一个类似的事情与一个充满整数的txt文件。相反,输出的是垃圾而不是文本文件的内容。

这里的第一个错误是VLA不是标准的c++特性。不要用

char txtCharacters[sizeArray];

也不做

while(!fin.eof() 

为什么iostream::eof在循环条件中(即:' while (!stream.eof()) ')被认为是错误的?下fillength读取到文件的末尾,但在此之后不能倒回文件。这个函数将文件加载到一个数组中,那么为什么要将它读入(或尝试读入)第二个数组呢?

for(int i=0; i<=sizeArray; i++)

你的意思

for(int i=0; i<sizeArray; i++)

更简单的方法是读入std::vector,不需要计算初始大小。仅push_back每个字符

来自老派的世界,我们使用fopen,freadfclose:

#include <stdio.h>
int read_file(const char* path, char* data, int max_length)
{
FILE *fp = fopen(path, "rb");
if (!fp) return 0;
int n = fread(data, 1, max_length, fp);
fclose(fp);
return n;
}
int main()
{
char data[1024] = { };
int l = read_file("message.txt", data, 1024);
printf("length = %dn", l);
printf("text = %sn", data);
return 0;
}

对于下面的message.txt(字母两次以新字符结尾,即26 + 26 + 1 = 53字节)

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz

得到以下输出:

length = 53
text = ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz

注意事项:

  • read_file是作为fopen,freadfclose的重构实现的
    • 我们以只读二进制模式打开文件
    • 如果文件不存在或有原因我们无法打开,我们提前退出0字节读取
    • 我们最多读取max_length,并返回实际读取的字节
    • 我们确保在退出
    • 之前关闭文件
  • main中,我将data声明为1024字节,即1K,这已经足够了
    • 我确保数据已经零初始化,所以,如果没有填充它,它将包含NUL字符
  • 我使用printf语句来显示已读取的内容

使用std::ifstream做同样的事情,我将简单地使用std::stringstd::getline,如下所示:

#include <iostream>
#include <fstream>
using namespace std;
int main()
{
ifstream fin("message.txt", ios::in | ios::binary);
string data, line;
if (fin.is_open()) {
while (getline(fin, line)) {
data += line + "n";
}
fin.close();
}
cout << "length = " << data.length() << "n";
cout << "text = " << data << "n";
return 0;
}

相关内容

  • 没有找到相关文章

最新更新