从fread剥离新行

时间:2016-01-23 09:49:43

标签: c

我正在使用此代码加载文件,但是出于某种原因,删除换行似乎会移除所有行,但第一行除外。

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

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

2 个答案:

答案 0 :(得分:2)

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的类型),而不是intint可能无法容纳文件大小。

答案 1 :(得分:0)

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

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

使用getc()将文件读入按需重新分配的缓冲区,一次一个块,这样更可靠。