我很惊讶在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 , "detectoroff\n");
现在结果还可以但是如果我运行两次,在第一个下面显示一个空行,如果它运行三次则显示另一个空行等。我该如何解决这个问题?
答案 0 :(得分:3)
将l1
的声明更改为:
char l1 [13];
detectoroff
是11个字符。你需要另一个字符用于换行符,另一个用于表示字符串结尾的空字节,总共13个字符。由于您仅使用12个字符声明l1
,因此fgets()
在数组边界外写入。这会导致未定义的行为。
使用std::string
和C ++流方法,你不会遇到这样的问题。
答案 1 :(得分:0)
不要害怕使用几千字节。
#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 [] = "detectoroff\n";
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;
}