首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从fread剥离新线路

从fread剥离新线路
EN

Stack Overflow用户
提问于 2016-01-23 09:49:43
回答 2查看 1.1K关注 0票数 0

我正在使用这段代码加载一个文件,但似乎由于某种原因,删除换行符也会删除除第一行之外的所有行。

代码语言:javascript
复制
void load_script(char* path) {
    FILE* file;
    char* script;
    int filesize = 0;

    file = fopen(path, "r");

    // determine file size
    fseek(file, 0L, SEEK_END);
    filesize = ftell(file);
    fseek(file, 0L, SEEK_SET);

    // allocate memory
    script = malloc(filesize + 1);

    // read script
    size_t size = fread(script, 1, filesize, file);
    script[size] = 0;

    printf("Before stripping:\n%s\n", script);

    // strip newlines
    script[strcspn(script, "\n")] = 0;

    printf("After stripping:\n%s\n", script);

    fclose(file);
    tokenize(script);
}

这是输出:

代码语言:javascript
复制
Before stripping:
line 1
line 2
line 3
After stripping:
line 1

我想知道从多行字符串中删除换行符的最佳方法。谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-01-23 09:51:43

代码语言:javascript
复制
script[strcspn(script, "\n")] = 0;

这将在第一个换行符之后终止C-字符串。您可能希望在字符串上循环,并将\n'替换为' '

类似于:

代码语言:javascript
复制
// strip newlines
for(size_t i = 0; script[i]; i++)
if (script[i] == '\n') script[i] = ' ';

顺便说一句,您应该使用off_t (POSIX定义的)来存储文件大小(作为filesize的类型),而不是intint可能无法保存文件的大小。

票数 2
EN

Stack Overflow用户

发布于 2016-01-23 10:50:16

除了l3x提供的解决方案之外,我还要补充一下,所使用的方法并不可靠:

  • ftell可能会失败,一旦成功,它的返回值就是只有当文件以二进制模式打开时,文件中的字节数。对于文本模式,除了它可以用作fseek的参数这一事实之外,标准没有任何保证。
  • 如果流不引用实际文件,则寻求文件结束和返回开始将无法正常工作:对于终端、字符设备或管道,它可能根本无法工作。

getc()将文件读取到缓冲区中,按需重新分配,一次只分配一个块,这要可靠得多。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34961982

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档