我希望将具有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
,fread
和fclose
:
#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
,fread
和fclose
的重构实现的- 我们以只读二进制模式打开文件
- 如果文件不存在或有原因我们无法打开,我们提前退出0字节读取
- 我们最多读取
max_length
,并返回实际读取的字节 - 我们确保在退出 之前关闭文件
- 在
main
中,我将data
声明为1024字节,即1K,这已经足够了- 我确保数据已经零初始化,所以,如果没有填充它,它将包含NUL字符
- 我使用printf语句来显示已读取的内容
使用std::ifstream
做同样的事情,我将简单地使用std::string
和std::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;
}