当我将文件添加到char数组中然后进行打印时,我得到了垃圾输出(随机ASCII符号)。该文件仅包含文本(一个段落)。

代码如下:

int arraySize = 0;
string line;
while(getline(inFile, line)){
    //cout << line << endl; // this will print array fine.
    arraySize += line.length();
}
char message[arraySize];
char encrypted[arraySize];
//adds file to array
int i = 0;
while(inFile.good() && !inFile.eof()){
    inFile.get(message[i]);
    i++;
}
message[i] = '\0';
//prints array
for(int i = 0; i < arraySize; i++){
    cout << message[i]; //this returns garbage values
}

我认为它的打印垃圾是因为它认为数组消息中什么也没有,但是我不知道为什么那里什么也没有。

最佳答案

原因是您在计算文本长度时到达文件末尾,因此读取指针位于文件末尾,然后再次使用它来读取文本文件。

为此,请执行以下操作:再次将读取指针获取到开头:

inFile.clear();
inFile.seekg(0, ios::beg);
while(inFile.get(message[i])){
    i++;
}

也不要使用:while (!infile.eof())它被认为是不正确的。
  • 我建议您使用std::vector,您不必担心文件大小或任何内存分配/取消分配。因此,您的代码可以像这样:
    std::ifstream inFile("data.txt"); // your file name here
    std::string strLine;
    std::vector<std::string> vecStr;
    
    while(std::getline(inFile, strLine))
        vecStr.push_back(strLine);
    
    for(int i(0); i < vecStr.size(); i++)
        std::cout << vecStr[i] << std::endl;
    
    inFile.close();
    

  • 您看过上面的代码有什么魅力吗?
  • 注意:因为数组仅被声明但未初始化,所以您获得了垃圾值:

  • 第一次读取将获取文本的长度。但是将读取指针移到末尾,然后执行以下操作:
    while(inFile.good() && !inFile.eof()){ // Will fail because inFile.eof() is true from the previous read.
        //std::cout << "Inside the reading loop" << std::endl;
        inFile.get(message[i]);
        i++;
    }
    

    正如您在上面看到的那样,由于先前的读取已到达eof,因此不会执行循环,因此仅声明了数组而未对其进行初始化,因此您知道该数组包含垃圾值。

    要确认未执行循环,请取消注释上面的行,并查看是否执行了循环。结果是没有打印消息,这意味着它没有被执行。

    关于c++ - 将文本文件追加到char数组,接收垃圾输出,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47063597/

    10-16 18:36
    查看更多