【问题标题】:Segmentation Fault Error over Writing the Twitter Stream on a Text File在文本文件上写入 Twitter 流时出现分段错误
【发布时间】:2012-01-03 12:24:42
【问题描述】:

我有一个 C 程序,可以从 Twitter API 打开推文流。这个程序的目的是打开一个流并将流写入一个文本文件。该程序仅在终端中打印流时成功,但是当我更改代码以写入文件时,现在在执行约 40 秒时出现“分段错误”错误。 size_t writefunc(void *ptr, size_t size, size_t nmemb, struct string *s) 是将流写入文件的回调函数,特别是在

fp=fopen("istream.txt", "a");
fprintf(fp, "%s", s->ptr);
fclose(fp);

为什么会出现“分段错误”错误?我应该如何解决这个问题?我想我用错了文件指针。

===================================

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <curl/curl.h>

struct string {
  char *ptr;
  size_t len;
};

void init_string(struct string *s) {
  s->len = 0;
  s->ptr = malloc(s->len+1);
  if (s->ptr == NULL) {
    fprintf(stderr, "malloc() failed\n");
    exit(EXIT_FAILURE);
  }
  s->ptr[0] = '\0';
}

size_t writefunc(void *ptr, size_t size, size_t nmemb, struct string *s)
{
  size_t new_len = s->len + size*nmemb;
  size_t max_buffer = 10240;
  FILE *fp;
  fp=fopen("istream.txt", "a"); // <------------- the ERROR! Remove this.

  s->ptr = realloc(s->ptr, new_len+1);
  if (s->ptr == NULL) {

    fprintf(stderr, "realloc() failed\n");
    exit(EXIT_FAILURE);
  }
  memcpy(s->ptr+s->len, ptr, size*nmemb);
  s->ptr[new_len] = '\0';
  s->len = new_len;

  if( s->len >= max_buffer )
  {
    fp=fopen("istream.txt", "a");
    fprintf(fp, "%s", s->ptr);
    fclose(fp);

    fflush( stdout );
    free(s->ptr);
    init_string( s );
  }

  return size*nmemb;
}

int main(void)
{
  CURL *curl;
  CURLcode res;


  curl = curl_easy_init();
  if(curl) {
    struct string s;
    init_string(&s);

    curl_easy_setopt(curl, CURLOPT_URL, "https://stream.twitter.com/1/statuses/sample.json");
    //curl_easy_setopt(curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
    curl_easy_setopt(curl, CURLOPT_USERPWD, "neilmarion:password");
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writefunc);
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, &s);
    res = curl_easy_perform(curl);

    //printf("%s\n", s.ptr);
    free(s.ptr);

    /* always cleanup */
    curl_easy_cleanup(curl);
  }
  return 0;
}

【问题讨论】:

  • 每次调用 writefunc 时都会泄露一个打开的文件。
  • @muistooshort 是什么意思?
  • writefunc 中有多少个fopen 调用?你fclosefopen的一切吗?
  • 哦。对不起。那是一个拼写错误。我编辑了上面的代码。 @muistooshort 尽管从实际代码中删除了额外的 fopen ,但没有解决任何问题。分段错误仍然存​​在。
  • 哦!抱歉@muistooshort 这实际上是错误。谢谢!

标签: c file stream twitter segmentation-fault


【解决方案1】:

您的程序中的大部分内容看起来都是正确的。

如果fp=fopen("istream.txt", "a"); 无法打开文件,很可能是连续行中的段错误。

尝试打印stderr 中的字符串来代替查看。如果可行,那么问题确实出在fp

其他评论:
由于您以追加模式打开文件,因此实际上没有必要收集缓冲区中的数据并继续重新分配缓冲区。您可以立即附加文件。

【讨论】:

  • 感谢您的回复!确实发现了错误。只是多了一个 fp=fopen("istream.txt", "a");在没有被关闭的代码中。我重新编辑了代码给大家看。
【解决方案2】:

每次你输入writefunc你打开istream.txt

FILE *fp;
fp=fopen("istream.txt", "a");

但您永远不会在fp 上致电fclose。你有这个:

fp=fopen("istreaam.txt", "a");
fprintf(fp, "%s", s->ptr);
fclose(fp);

稍后,但第二个 fopen 意味着您不再引用第一个 fopen 返回的内容。

最终,您将用完打开的文件,进一步的fopen 调用将失败。显然这需要大约 40 秒。所以去掉第一个fopen再试一次。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-06
    • 1970-01-01
    • 1970-01-01
    • 2014-04-04
    • 2016-09-02
    • 1970-01-01
    相关资源
    最近更新 更多