字符串和字符不兼容
string and char incompatibilities
我很惊讶在c++中没有一个内置的方法来强制转换字符串和字符。这是我的问题:我想更新文本文件中的一行,所以:
#include <stdlib.h>
#include <fstream>
#include <windows.h>
#include <iostream>
#include <stdio.h>
using namespace std;
int main(void) {
char l1 [12];
char l2 [15];
char l3 [15];
char l4 [15];
char md [16];
FILE * myfile2 = fopen("state.txt", "r+");
fgets(l1,12,myfile2);
fgets(l2,12,myfile2);
fgets(l3,12,myfile2);
fgets(l4,12,myfile2);
fseek ( myfile2 , 0 , SEEK_SET );
strcpy(md , "detectoroff");
fputs (md,myfile2);
strcpy(md,l2);
fputs (md,myfile2);
strcpy(md,l3);
fputs (md,myfile2);
strcpy(md,l4);
fputs (md,myfile2);
Sleep(1000);
fclose(myfile2);
return EXIT_SUCCESS;
}
最初的文本文件有
a
b
c
d
当运行代码时,输出是
detectoroffb
c
d
如果我替换行
strcpy(md , "detectoroff");
由这个 strcpy(md , "detectoroffn");
现在的结果是ok的,但如果我运行这两次,出现在第一个空行和另一个如果它运行三次等。如何解决这个问题?
修改l1
的声明为:
char l1 [13];
detectoroff
是11个字符。换行符需要另一个字符,空字节需要另一个字符,表示字符串的结束,总共是13。由于您仅用12个字符声明l1
,因此fgets()
写入数组边界之外。这将导致未定义的行为。
使用std::string
和c++流方法,你就不会遇到这样的问题了
不要害怕使用几千字节。
#include <cstdlib>
#include <cstdio>
int main(void) {
using namespace std;
static const int BUFFERSIZE = 4096;
char line_1[BUFFERSIZE];
char line_2[BUFFERSIZE];
char line_3[BUFFERSIZE];
char line_4[BUFFERSIZE];
char md [] = "detectoroffn";
FILE * myfile2 = fopen("state.txt", "r+");
fgets(line_1, BUFFERSIZE, myfile2);
fgets(line_2, BUFFERSIZE, myfile2);
fgets(line_3, BUFFERSIZE, myfile2);
fgets(line_4, BUFFERSIZE, myfile2);
fseek(myfile2, 0, SEEK_SET );
fputs(md, myfile2);
fputs(line_2, myfile2);
fputs(line_3, myfile2);
fputs(line_4, myfile2);
fclose(myfile2);
return EXIT_SUCCESS;
}
最好是用c++而不是C风格编写这个程序:
#include <fstream>
#include <string>
int main(void) {
using namespace std;
string line_1, line_2, line_3, line_4;
string md("detectoroff");
fstream myfile2("state.txt", fstream::in|fstream::out);
getline(myfile2, line_1);
getline(myfile2, line_2);
getline(myfile2, line_3);
getline(myfile2, line_4);
myfile2.clear();
myfile2.seekg(0, ios::beg);
myfile2
<< md << 'n'
<< line_2 << 'n'
<< line_3 << 'n'
<< line_4 << 'n';
myfile2.close();
return 0;
}
相关文章:
- 我收到同义重复编译器错误。我应该如何修复"类型"X"的参数与类型"X"的参数不兼容?
- 字符类型转换不兼容
- Qt:如何使不兼容的发送方/接收方参数兼容?
- 视觉工作室 2017;启用 /permissive 时,类型 "const wchar_t *" 的参数与类型 "PWSTR" 的参数不兼容
- 使用不兼容的分配器复制分配无序列图
- 无法将字符串数组声明为类成员而不是字符 (C++)
- 类型为 "int*" 的参数与 C++ 中错误类型"int**"参数不兼容
- 该对象具有与成员函数不兼容的类型限定符.为什么会出现此错误?
- 我正在尝试将表的地址传递给要在另一个函数中使用的指针,但得到不兼容的指针类型
- 为什么范围算法与 std 的迭代器不兼容?
- Winpcap Findalldevs const char * 与 char * 不兼容
- 字符* 和无符号字符* 之间不兼容
- C++ 奇怪的字符*参数问题(不兼容的类型)
- 确定将宽字符与不兼容的字符 API 一起使用时的最佳做法
- 不兼容的转换字符
- C++ wifstream:不兼容的字符常量*,wchar_t康斯特*类型
- 比较 C++ 中的字符 - 类型为"char"的参数与类型为"const char * "的参数不兼容
- 错误 [Pe167]:类型为"uint16_t *"的参数与类型为"无符号字符 *"的参数不兼容
- 字符串和字符不兼容
- 与指针参数不兼容的无符号字符数组