我想写几个字符串来存档。字符串是
37 1 0 0 0 0
15 1 0 0 0 0
33 1 0 0 0 0
29 1 0 0 0 0
18 1 0 0 0 0
25 1 0 0 0 0
我首先要将每一行存储为字符串数组的元素,然后调用相同的字符串数组并将其元素写入文件。
#include <stdio.h>
#include <vector>
#include <string>
using namespace std;
int writeFile() {
char line[100];
char* fname_r = "someFile_r.txt"
char* fname_w = "someFile_w.txt";
vector<string> vec;
FILE fp_r = fopen(fname_r, "r");
if(fgets(line, 256,fp_r) != NULL) {
vec.push_back(line);
}
FILE fp_w = fopen(fname_w, "w");
for(int j = 0; j< vec.size(); j++) {
fprintf(fp_w, "%s", vec[j]); // What did I miss? I get funny symbols here. I am expecting an ASCII
}
fclose(fp_w);
fclose(fp_r);
return 0;
}
答案 0 :(得分:7)
格式说明符"%s"
需要一个C样式的空终止字符串,而不是std::string
。改为:
fprintf(fp_w, "%s", vec[j].c_str());
由于这是C ++,您应该考虑使用ofstream
而不是类型安全的并接受std::string
作为输入:
std::ofstream out(fname_w);
if (out.is_open())
{
// There are several other ways to code this loop.
for(int j = 0; j< vec.size(); j++)
out << vec[j];
}
同样,使用ifstream
作为输入。发布的代码有可能的缓冲区溢出:
char line[100];
...
if(fgets(line, 256,fp_r) != NULL)
line
可以存储最多100
个字符,但fgets()
表示它可以容纳256
。使用std::getline()
可以填充std::string
:
std::ifstream in(fname_r);
std::string line;
while (std::getline(in, line)) vec.push_back(line);
答案 1 :(得分:0)
在这种情况下,vec [j]是std :: string对象。但是fprintf
s
期望c样式的以null结尾的字符串。
for(int j = 0; j< vec.size(); j++) {
fprintf(fp_w, "%s", vec[j]);
}
你需要从std :: string获取指向c风格字符串的指针。可以使用c_str
方法:
for(int j = 0; j< vec.size(); j++) {
fprintf(fp_w, "%s", vec[j].c_str());
}
在任何情况下,您都混合使用C ++和C代码。这太丑了。使用std :: fstream会更好。