该程序接收输入,逐个字符地写入文件,计算输入的字符数,然后最后将其复制到字符数组。该程序运行正常,直到我们转到以下代码段file.getline(arr, inputLength);
。它会更改.txt文件数据并仅返回原始输入的第一个字符。
有什么想法吗?
#include <iostream>
#include <fstream>
using namespace std;
int getLine(char *& arr);
int main() {
char * arr = NULL;
cout << "Write something: ";
getLine(arr);
return 0;
}
int getLine(char *& arr) {
fstream file("temp.txt");
char input = '\0'; //initialize
int inputLength = 0; //initialize
if (file.is_open()) {
while (input != '\n') { //while the end of this line is not reached
input = cin.get(); //get each single character
file << input; //write it on a .txt file
inputLength++; //count the number of characters entered
}
arr = new char[inputLength]; //dynamically allocate memory for this array
file.getline(arr, inputLength); //HERE IS THE PROBLEM!!! ***
cout << "Count : " << inputLength << endl; //test counter
cout << "Array : " << arr << endl; //test line copy
file.close();
return 1;
}
return 0;
}
答案 0 :(得分:0)
我发现此代码至少存在两个问题。
1)默认情况下,std::fstream
构造函数将打开现有文件。它不会创建一个新的。如果temp.txt
不存在,is_open()
将失败。此代码应将第二个参数的相应值传递给std::fstream
构造函数,该构造函数指定需要创建新文件或创建现有文件。
与此相关:如果文件已经存在,则运行此代码不会截断它,因此该程序上一次运行的文件内容将有明显的意外结果。
2)此代码的目的似乎是回读之前写入其中的内容temp.txt
。为了正确地做到这一点,在写入之后和阅读之前,有必要回到文件的开头。这部分似乎缺失了。
答案 1 :(得分:0)
动态分配没有必要,因为std库函数与混合参数混淆,例如cstring和指向cstring的指针。我在Visual Studio 2015编译器中测试了这段代码。它运作良好。确保包含所有需要的库:
#include <iostream>
#include <fstream>
#include<cstring>
#include<string>
using namespace std;
void getLine();
int main() {
cout << "Write something: ";
// no need to pass a pointer to a cstring
getLine();
system("pause");
return 0;
}
void getLine() {
char input[100]; // this is a cstring with
//a safe const number of elements
int inputLength; //to extract length of the actual input
//this function requires cstring as a first argument
// and constant length as a second
cin.get(input, 100, '\n'); //get each single character
//cast streamsize into int
inputLength = static_cast<int>(cin.gcount());
//testing input
cout << "Input: \n";
for (int i = 0; i < inputLength; i++)
{
cout << input[i];
}
cout << endl;
char arr[100];
strcpy_s(arr, input);
cout << "Count : " << inputLength << endl; //test counter
cout << "Array : " << endl; //test line copy
for (int i = 0; i < inputLength; i++)
{
cout << arr[i];
}
cout << endl;
// write cstring to a file
ofstream file;
file.open("temp.txt", ios::out);
if (file.is_open())
{
//write only what was entered in input
for (int i = 0; i < inputLength; i++)
file << arr[i];
file.close();
}
else cout << "Unable to open file";
}