c ++文件输入/输出

时间:2010-04-30 20:01:52

标签: c++ pointers file-io

我正在尝试使用fgets和sscanf从文件中读取。在我的文件中,我在while的每一行都有字符,我希望将其放入向量中。到目前为止,我有以下内容:

FILE *fp;
  fp = fopen(filename, "r");
  if(!fp)
  {
    fprintf(stderr, "Unable to open file %s\n", filename);
    return 0;
  }
  // Read file
  int line_count = 0;
  char buffer[1024];
  while(fgets(buffer, 1023, fp))
  {
    // Increment line counter
    line_count++;

    char *bufferp = buffer;

    ...

    while(*bufferp != '\n')
    {
      char *tmp;
      if(sscanf(bufferp, "%c", tmp) != 1)
      {
        fprintf(stderr, "Syntax error reading axiom on "
                "line %d in file %s\n", line_count, filename);
        return 0;
      }

      axiom.push_back(tmp);
      printf("put %s in axiom vector\n", axiom[axiom.size()-1]);

      // increment buffer pointer
      bufferp++;
    }
  }

我的公理向量定义为vector<char *> axiom;。当我运行程序时,我遇到了一个seg错误。当我执行sscanf时会发生这种情况。关于我做错了什么的建议?

2 个答案:

答案 0 :(得分:2)

tmp是一个指针,而不是一个数组,因此读入它会导致缓冲区溢出。

首先,您应该将tmp的声明更改为:

  char *tmp = malloc(SOME_MAXIMUM_SIZE * sizeof(char));

然后你应该记得在完成后释放axioms中的所有指针。

答案 1 :(得分:2)

更安全的方法是使用std::stringstd::vector<std::string>

string类型处理文本的内存分配。另请参阅getlinestd::string::c_str()