我的sprintf缓冲区有问题。 正如您在下面的代码中看到的那样,我使用sprintf将一个char数组保存到缓冲区中,因此pFile可以检查文件夹中是否有一个像这样的文件。如果找到,则将缓冲区值分配给timecycles [numCycles],并增加numCycles。示例:timecycles [0] =“ timecyc1.dat”。它运行良好,并且您可以在控制台输出中看到,它可以识别出文件夹中只有timecyc1.dat和timecyc5.dat。但是,只要我想通过for循环读取时间周期,两个索引的值均为“ timecyc9.dat”,即使对于时间周期[0]应该为“ timecyc1.dat”,对于时间周期应该为“ timecyc5.dat” {{3 }}。第二件事是,我该如何编写代码,使readTimecycles()返回char *时间周期,而我可以使用char * timecycles [9] = readTimecycles()或类似的东西在主函数中对其进行初始化?
#include <iostream>
#include <cstdio>
char* timecycles[9];
void readTimecycles()
{
char buffer[256];
int numCycles = 0;
FILE* pFile = NULL;
for (int i = 1; i < 10; i++)
{
sprintf(buffer, "timecyc%d.dat", i);
pFile = fopen(buffer, "r");
if (pFile != NULL)
{
timecycles[numCycles] = buffer;
numCycles++;
std::cout << buffer << std::endl; //to see if the buffer is correct
}
}
for (int i = 0; i < numCycles; i++)
{
std::cout << timecycles[i] << std::endl; //here's the issue with timecyc9.dat
}
}
int main()
{
readTimecycles();
return 0;
}
答案 0 :(得分:1)
有任务
timecycles[numCycles] = buffer;
由于您只有一个buffer
,因此使 all 指针指向相同缓冲区。
由于您使用C ++进行编程,因此可以使用std::string
来轻松解决问题。
如果我将您的代码重新制作成有点像C ++的代码,而有点像C ++的代码,则它看起来可能像
std::array<std::string, 9> readTimeCycles()
{
std::array<std::string, 9> timecycles;
for (size_t i = 0; i < timecycles.size(); ++i)
{
// Format the file-name
std::string filename = "timecyc" + std::to_string(i + 1) + ".dat";
std::ifstream file(filename);
if (file)
{
// File was opened okay
timecycles[i] = filename;
}
}
return timecycles;
}
参考文献:
答案 1 :(得分:1)
基本问题是您对字符串的概念与C ++中的“字符数组”不匹配。特别是您认为,因为您以某种方式分配了timecycles[numCycles] = buffer;
,所以char数组的char被复制了。但是在C ++中,所有要复制的内容都是一个指针,因此timecycles
最终以多个指针指向同一缓冲区。更不用说退出readTimecycles
函数时遇到的问题了。届时,您将有多个指向缓冲区的指针,该缓冲区不再存在,因为在退出readTimecycles
函数时该缓冲区将被破坏。
解决此问题的方法是使用符合您期望的C ++代码。特别是std::string
将按照您期望的方式进行复制。您可以通过以下方式更改代码以使用std::string
#include <string>
std::string timecycles[9];
timecycles[numCycles] = buffer; // now this really does copy a string