0

我很惊讶在 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");

现在结果还可以,但是如果我运行两次,在第一个下出现一个空行,如果运行三次,则在另一个下出现一个空行等。我该如何解决这个问题?

4

2 回答 2

3

将声明更改l1为:

char l1 [13];

detectoroff是 11 个字符。您需要另一个字符作为换行符,另一个字符用于指示字符串结尾的空字节,总共 13 个。由于您只声明l1了 12 个字符,fgets()因此在数组范围之外写入。这会导致未定义的行为。

使用std::string和 C++ 流方法,你不会遇到这样的问题。

于 2013-05-16T00:04:37.877 回答
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;
}
于 2013-05-16T00:13:45.397 回答