fprintf, strings and vectors
本问题已经有最佳答案,请猛点这里访问。
Possible Duplicate:
c++ - printf on strings prints gibberish
我想将几个字符串写入文件。字符串是
1 2 3 4 5 6 | 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 |
我首先想将每一行存储为字符串数组的元素,然后调用相同的字符串数组并将其元素写入文件。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | #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; } |
格式说明符
1 | fprintf(fp_w,"%s", vec[j].c_str()); |
因为这是 C ,您应该考虑使用
1 2 3 4 5 6 7 | 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]; } |
同样,使用
1 2 3 | char line[100]; ... if(fgets(line, 256,fp_r) != NULL) |
1 2 3 | std::ifstream in(fname_r); std::string line; while (std::getline(in, line)) vec.push_back(line); |
在这种情况下 vec[j] 是 std::string 对象。但是
1 2 3 | for(int j = 0; j< vec.size(); j++) { fprintf(fp_w,"%s", vec[j]); } |
你只需要从 std::string 获取指向 c 风格字符串的指针。可以使用
1 2 3 | for(int j = 0; j< vec.size(); j++) { fprintf(fp_w,"%s", vec[j].c_str()); } |
在任何情况下,您都混合了 C 和 C 代码。它很丑。使用 std::fstream 更好。