繁体   English   中英

从fread中剥离换行符

[英]Stripping newlines from fread

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

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);
}

这是输出:

Before stripping:
line 1
line 2
line 3
After stripping:
line 1

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

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

这将在第一个换行符之后终止C字符串。 您可能需要遍历字符串,并将\\n'替换为' '

就像是:

// strip newlines
for(size_t i = 0; script[i]; i++)
if (script[i] == '\n') script[i] = ' ';

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

除了l3x提供的解决方案之外,我还应该补充一点,即所使用的方法不可靠:

  • ftell可能会失败,并且成功后,仅当以二进制模式打开文件时,其返回值才是文件中的字节数。 对于文本模式,标准不保证可以用作fseek的参数。
  • 如果流未引用实际文件,则寻求到文件末尾并返回到开头将无法按预期进行:对于终端,字符设备或管道,它可能根本无法工作。

将文件与getc()一起读入按需重新分配的缓冲区(一次一个块getc()要可靠得多。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM