Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >将文件保存为特定线程中的字符串

将文件保存为特定线程中的字符串
EN

Stack Overflow用户
提问于 2018-02-04 03:20:12
回答 1查看 54关注 0票数 0

我试图在线程内将一个文本文件保存到C中的字符串中,但我总是得到一个分段错误。这发生在正在创建的线程的实例中。我以前没有使用过线程,所以我不确定这是否是导致问题的原因。

代码语言:javascript
运行
AI代码解释
复制
int getCurrentSegmentWordcount(int segment) { //declaring file pointer (value?)
    printf("func\n");
    char text[1000];
    char buffer[150];
    FILE *fp = fopen("words.txt", "r");
    if(fp == NULL) {
        printf("null file");
    }
    int i = 0;
    // while(feof(fp)) {
    //  text[i++] = fgetc(fp);
    // }
    // text[i] = '\0'; //set null char to end string

    while(fgets(buffer, 150, fp)) {
        strcpy(text[i], buffer);
        printf("\n\n %s \n\n", text[i]);
        i++;
    }
    getchar();

    pthread_exit(NULL);
}

下面是我的编译器警告。没有错误,但有多个警告。

代码语言:javascript
运行
AI代码解释
复制
assign2.c: In function ‘print_hello_world’:
assign2.c:10:9: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘void *[-Wformat=]
  printf("Hello World. Greetings from thread %d\n", tid);
         ^
assign2.c: In function ‘getCurrentSegmentWordcount’:
assign2.c:29:10: warning: passing argument 1 of ‘strcpy’ makes pointer from integer without a cast [-Wint-conversion]
   strcpy(text[i], buffer);
          ^
In file included from assign2.c:4:0:
/usr/include/string.h:125:14: note: expected ‘char * restrict’ but argument is of type ‘char’
 extern char *strcpy (char *__restrict __dest, const char *__restrict __src)
              ^
assign2.c:30:10: warning: format ‘%s’ expects argument of type ‘char *, but argument 2 has type ‘int’ [-Wformat=]
   printf("\n\n %s \n\n", text[i]);
          ^
assign2.c: In function ‘main’:
assign2.c:46:77: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
   status = pthread_create(&threads[i], NULL, getCurrentSegmentWordcount(i), (void * )i);
                                                                             ^
assign2.c:46:46: warning: passing argument 3 of ‘pthread_create’ makes pointer from integer without a cast [-Wint-conversion]
   status = pthread_create(&threads[i], NULL, getCurrentSegmentWordcount(i), (void * )i);
                                              ^
In file included from assign2.c:1:0:
/usr/include/pthread.h:233:12: note: expected ‘void * (*)(void *)’ but argument is of type ‘int’
 extern int pthread_create (pthread_t *__restrict __newthread,
            ^
assign2.c:52:7: warning: passing argument 1 of ‘exit’ makes integer from pointer without a cast [-Wint-conversion]
  exit(NULL);
       ^
In file included from assign2.c:3:0:
/usr/include/stdlib.h:543:13: note: expected ‘int’ but argument is of type 

‘void *’
     extern void exit (int __status) __THROW __attribute__ ((__noreturn__));
./assign2exec
Main here. Creating thread 0
func
Makefile:20: recipe for target 'all' failed
make: *** [all] Segmentation fault (core dumped)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-04 04:41:39

你要做的第一件事,就是阅读编译器警告,而不是忽略它们。他们在那里是给你暗示你做错了什么,他们不是在那里惹恼你。

函数strcpy具有以下签名:

代码语言:javascript
运行
AI代码解释
复制
#include <string.h>

char *strcpy(char *dest, const char *src);

从这里可以清楚地看出,它希望dest是指向char数组的指针,src指向的字符串将保存在该数组中。

你声明了char buffer[150];,所以buffer是一个char数组,buffer[i]将返回一个char。因此,您正在将错误的类型传递给strcpy

编译器会告诉你:

代码语言:javascript
运行
AI代码解释
复制
assign2.c: In function ‘getCurrentSegmentWordcount’:
assign2.c:29:10: warning: **passing argument 1 of ‘strcpy’ makes pointer from integer without a cast** [-Wint-conversion]
   strcpy(text[i], buffer);

你需要有一个2维的char数组或者一个char指针数组来保存它。第一个是最容易编写的:

代码语言:javascript
运行
AI代码解释
复制
char text[1000][1000];

唯一的问题是它在行数上有一个固定的长度,如果文件有超过1000行,你不能将它们全部存储在缓冲区中。

第二个选项更健壮:

代码语言:javascript
运行
AI代码解释
复制
int getCurrentSegmentWordcount(int segment) {
    char (*text)[1000] = NULL, char (*tmp)[1000];

    ...
    i = 0;
    while(fgets(buffer, sizeof buffer, fp)) {

        // removing possible \n from buffer, you probably
        // want that
        buffer[strcspn(buffer, "\n")] = 0;

        tmp = realloc(text, (i+1) * sizeof *tmp);
        if(tmp == NULL)
        {
            // error, cannot continue
            free(text);
            return;
        }

        text = tmp;
        strcpy(text[i], buffer);
        printf("\n\n %s \n\n", text[i]);
        i++;
    }
    ...

    free(text); // freeing the memory
}

而且这个版本甚至可以处理不同长度的行

代码语言:javascript
运行
AI代码解释
复制
int getCurrentSegmentWordcount(int segment) {
    char **text = NULL, **tmp;

    ...
    i = 0;
    while(fgets(buffer, sizeof buffer, fp)) {

        // removing possible \n from buffer, you probably
        // want that
        buffer[strcspn(buffer, "\n")] = 0;

        tmp = realloc(text, (i+1) * sizeof *tmp);
        if(tmp == NULL)
        {
            // error, cannot continue
            free(text);
            return;
        }

        text = tmp;

        text[i] = calloc(strlen(buffer) + 1, 1);

        if(text[i] == NULL)
        {
            // error, free all the allocated memory:
            for(int j = 0; j < i; ++j)
                free(text[j]);

            free(text);

            return;

        }

        strcpy(text[i], buffer);
        printf("\n\n %s \n\n", text[i]);
        i++;
    }
    ...

    // freeing the memory
    for(int j = 0; j < i; ++i)
        free(text[i]);

    free(text);
}

我不知道这是不是你的例子,但是你的函数是没有意义的。您将行存储在缓冲区中,但根本不对其执行任何操作。如果你返回了text或者用它做了些什么,这个函数会更有效率。

编译器警告和错误向您显示了需要改进代码的所有行。一行有趣的代码是:

代码语言:javascript
运行
AI代码解释
复制
assign2.c:52:7: warning: passing argument 1 of ‘exit’ makes integer from pointer without a cast [-Wint-conversion]
  exit(NULL);

正确的调用是

代码语言:javascript
运行
AI代码解释
复制
exit(0);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48604348

复制
相关文章
Python批量将Photoshop文件保存为图片
这是给zhenguo老师的投稿,已经收获50元稿费。 困扰我的问题 我是一名电商美工设计师,俗称电商图片搬运工,我的桌面经常是这样的。 再就是这样的。 各种的psd文件再加上文字无法表达色彩和构图的关键信息,时间一久就让我无法分辨这些区别。 以前的解决办法 以前我的办法就是一张一张的保存。然后放到文件的中。或者是采用新版本或者自带预览功能的软件。(这两种办法要不就是有局限性太麻烦,要不就是做到让哭555555)再加上每天再设计的过程中会产生源源不断的psd文件,所以这个问题是很困扰我的。 遇到转机 后来
double
2022/06/29
1.5K0
Python批量将Photoshop文件保存为图片
将网页中的canvas保存为图片
收到网友的请求,想把canvas保存为图片,其实很简单,canvas自带方法 打开网页,如https://en.dpm.org.cn/dyx.html?path=/tilegenerator/dest
一朵灼灼华
2022/08/05
2.5K0
将网页中的canvas保存为图片
将cmd中命令输出保存为TXT文本文件
例如:将Ping命令的加长包输出到D盘的ping.txt文本文件。 1、在D:目录下创建文本文件ping.txt(这步可以省略,偶尔提示无法创建文件时需要) 2、在提示符下输入ping www.idoo.org.ru -t > D:ping.txt 3、这时候发现D盘下面的ping.txt里面已经记录了所有的信息 备注: 只用“>”是覆盖现有的结果,每一个命令结果会覆盖现有的txt文件,如果要保存很多命令结果的话,就需要建立不同文件名的txt文件。 那么有没有在一个更好的办法只用一个txt文件呢?答案是肯定的,要在同一个txt文件里面追加cmd命令结果,就要用“>>”替换“>” 就可以了.
Hongten
2018/09/13
4.4K0
将cmd中命令输出保存为TXT文本文件
python中删除特定字符串
import re text = ‘wo,didi;wode,;wode’ text0 = text.replace(‘didi’, ”) print(re.sub(‘[,;]’, ‘ ‘, text0))
全栈程序员站长
2022/09/02
3.5K0
Asp.Mvc将生成的视图保存为字符串
public static class ViewExtensions { /// <summary> /// 在控制器内获取指定视图生成后的HTML /// </summary> /// <param name="context">当前控制器的上下文</param> /// <param name="viewName">视图名称</param> /// <param name="model">视
用户1055830
2018/04/18
1.3K0
Asp.Mvc将生成的视图保存为字符串
在字符串中删除特定的字符
题目:输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。例如,输入”They are students.”和”aeiou”,则删除之后的第一个字符串变成”Thy r stdnts.”。 首先我们考虑如何在字符串中删除一个字符。由于字符串的内存分配方式是连续分配的。我们从字符串当中删除一个字符,需要把后面所有的字符往前移动一个字节的位置。但如果每次删除都需要移动字符串后面的字符的话,对于一个长度为n的字符串而言,删除一个字符的时间复杂度为O(n)。而对于本题而言,有可能要删除的字符的个数是n,因此该
猿人谷
2018/01/17
9.3K0
Python提取PDF文件中的表格文本保存为Excel文件
提取PDF文件中的表格文字,保存为Excel文件,PDF中每个表格的文本写入Excel文件中的一个工作表。
Python小屋屋主
2021/01/24
3.1K0
Python字符串中删除特定字符的方法
这篇文章主要介绍了Python字符串中删除特定字符的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 分析
全栈程序员站长
2022/06/28
6.7K0
Python字符串中删除特定字符的方法
Python提取Word文件中的目录标题保存为Excel文件
《Python程序设计(第3版)》,(ISBN:978-7-302-55083-9),董付国,清华大学出版社,2020年6月第1次印刷,2021年1月第6次印刷,山东省一流本科课程“Python应用开发”配套教材,清华大学出版社2020年度畅销图书(本书第二版为2019、2020年度畅销图书)
Python小屋屋主
2021/03/16
2.5K0
Python提取Word文件中的目录标题保存为Excel文件
java中删除特定后缀名文件
File file=new File("");//里面输入特定目录 File temp=null; File[] filelist= file.listFiles(); for(int i=0;i<filelist.length;i++) {temp=filelist[i]; if(temp.getName().endsWith(""))//获得文件名,如果后缀为“”,这个你自己写,就删除文件 {temp.delete();//删除文件} } 
闵开慧
2018/03/30
1.9K0
python删除特定文件
[Python]代码     #!/usr/bin/python # -*- coding: utf-8 -*- import os def del_files(path): for root , dirs, files in os.walk(path): for name in files: if name.endswith(".CR2"): os.remove(os.path.join(root, name))
用户7718188
2021/11/02
2.2K0
python删除特定文件
python删除特定文件 [Python]代码     #!/usr/bin/python # -*- coding: utf-8 -*- import os def del_files(path): for root , dirs, files in os.walk(path): for name in files: if name.endswith(".CR2"): os.remove(os.path.join(root,
用户7705674
2021/11/01
2.1K0
java中替换字符串特定字符replace,replaceAll,replaceFirst
String number = "123,456,5234,52345,63456,7456,7";
用户7886150
2021/04/07
2.6K0
【说站】python截取字符串中特定部分
本文教程操作环境:windows7系统、Python 3.9.1,DELL G3电脑。
很酷的站长
2022/11/23
2.2K0
【说站】python截取字符串中特定部分
原 状态机 搜索字符串中的特定占位符
问题:xz[[cenvENVzxcENV[      fffff  ]dsbgENV[fecccccc]nqe  W3]NBENV[]ZXC   这个字符串中总共有三个变量区,规定ENV[]  方括号中间包含的即是变量,那么使用的过程中需要找到这个变量在替换。 使用状态机首先需要定义系统的状态的个数及状态之间的转换过程及条件 本例中总共定义了6种状态 common char:普通字符串 env:变量内容 over:状态机终止(字符串超长)  maybe:可能属于变量 maybeOver:后面紧跟
魂祭心
2018/05/17
3.4K0
php 截取特定字符串
1、php 截取特定字符后面的内容 可以使用函数strripos,获取一个字符串在另一个字符串中第一次出现的位置。
用户8099761
2023/05/11
1.4K0
如何使用VBA统计字符串中某个特定字符
如果要统计某单元格中指定的某特定字符的数量,可以使用LEN/SUBSTITUTE函数组合的经典公式(假设字符串位于单元格B2):
fanjy
2022/06/04
5.7K0
如何使用VBA统计字符串中某个特定字符
matlab处理多个文件夹中的image,保存为mat格式。
train = cell(11400, 1); label = zeros(11400, 1); dis1 = dir(['E:\Adesk\Cpp-Primer\PCANet\PCANet\datas\train\' '.']); nms1 = {dis1.name}; i=0; for m = 1:length(nms1)     nm1 = ['E:\Adesk\Cpp-Primer\PCANet\PCANet\datas\train\' nms1{m}];     dis2 = dir([nm1 '
MachineLP
2022/05/09
1.1K0
Python+pandas爬取网页中的表格保存为Excel文件
以链接“非计算机专业《Python程序设计基础》教学参考大纲”为例,在其中有一个表格,内容如下:
Python小屋屋主
2021/07/19
2.2K0
点击加载更多

相似问题

将文件保存为Mongodb中的字符串

25

如何将仅包含特定字符串(在CSV文件中)的行保存为单独的CSV文件?

11

将matlab绘图保存为特定大小的EMF-文件。

17

java:将字符串保存为gzip文件

30

将字符串保存为html文件android

46
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档