我正在使用这段代码加载一个文件,但似乎由于某种原因,删除换行符也会删除除第一行之外的所有行。
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我想知道从多行字符串中删除换行符的最佳方法。谢谢。
发布于 2016-01-23 09:51:43
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可能无法保存文件的大小。
发布于 2016-01-23 10:50:16
除了l3x提供的解决方案之外,我还要补充一下,所使用的方法并不可靠:
ftell可能会失败,一旦成功,它的返回值就是只有当文件以二进制模式打开时,文件中的字节数。对于文本模式,除了它可以用作fseek的参数这一事实之外,标准没有任何保证。用getc()将文件读取到缓冲区中,按需重新分配,一次只分配一个块,这要可靠得多。
https://stackoverflow.com/questions/34961982
复制相似问题