C 将字符串打印到文件的有效方法
我有一个C 将字符串打印到文件的有效方法,c,C,我有一个 char* aString 我想写下介于from和to之间的部分,最有效的方法是什么 我想到了一种一次写1个字符的方法 char* p = aString + from; for (int i =0; i < (to-from); i++) { fprintf(aFile, "%c", p++); } 我想知道是否有更快的方法 写 Don说得对,fwrite是最快的 也就是说,这里有一个printf和snprintf、vprintf等的鲜为人知的特性,它允许您在一次调
char* aString
我想写下介于from和to之间的部分,最有效的方法是什么
我想到了一种一次写1个字符的方法
char* p = aString + from;
for (int i =0; i < (to-from); i++) {
fprintf(aFile, "%c", p++);
}
我想知道是否有更快的方法
写
Don说得对,fwrite是最快的 也就是说,这里有一个printf和snprintf、vprintf等的鲜为人知的特性,它允许您在一次调用中完成这项工作
printf("%.*s", to - from, aString + from);
这是怎么回事。为字符串提供精度表示,如果首先找到“\0”,则打印的字符数不能超过可以打印的字符数。这样的一句话:
printf("%.5s", "0123456789");
将打印:
01234
接下来,如果需要在运行时指定精度,请将数字替换为*并在字符串之前提供长度作为函数参数:
printf("%.*s", 5, "0123456789"); // same as before
如果您只想打印字符串的一部分,那么这个技巧就太过分了。但与其他格式结合使用,它会非常有用:
printf("Token %d: \"%.*s\"\n",
tok,
token_info[tok].len,
str + token_info[tok].start);
Don说得对,fwrite是最快的 也就是说,这里有一个printf和snprintf、vprintf等的鲜为人知的特性,它允许您在一次调用中完成这项工作
printf("%.*s", to - from, aString + from);
这是怎么回事。为字符串提供精度表示,如果首先找到“\0”,则打印的字符数不能超过可以打印的字符数。这样的一句话:
printf("%.5s", "0123456789");
将打印:
01234
接下来,如果需要在运行时指定精度,请将数字替换为*并在字符串之前提供长度作为函数参数:
printf("%.*s", 5, "0123456789"); // same as before
如果您只想打印字符串的一部分,那么这个技巧就太过分了。但与其他格式结合使用,它会非常有用:
printf("Token %d: \"%.*s\"\n",
tok,
token_info[tok].len,
str + token_info[tok].start);
您可以按如下方式使用fwrite:
char *s = "abcdef";
fwrite(s,sizeof(char),2,stdout); // prints ab
fwrite(s+2,sizeof(char),2,stdout); // prints cd
// In general
fwrite(s+from,sizeof(char),to-from,stdout); // print char bet s[from] to s[to]
如果要写入文件,可以用相应的文件指针替换stdout。可以使用fwrite,如下所示:
char *s = "abcdef";
fwrite(s,sizeof(char),2,stdout); // prints ab
fwrite(s+2,sizeof(char),2,stdout); // prints cd
// In general
fwrite(s+from,sizeof(char),to-from,stdout); // print char bet s[from] to s[to]
如果要写入文件,可以用相应的文件指针替换stdout。我怀疑这种技术。根据我的经验,printf在这种情况下不会截断参数。手册页上说:在任何情况下,不存在的或较小的字段宽度都不会导致字段截断;如果转换结果比字段宽度宽,则字段将展开以包含来自的转换结果。@unwind:您读取了错误的部分。指定的是精度,而不是字段宽度,并且精度对%s有特殊的行为。@unwind-正如jamesdlin正确指出的,在我描述精度时,您指的是字段宽度。仅指定字段宽度时,不使用句点;当同时指定字段宽度和精度时,字段宽度在周期之前,而精度在周期之后。我怀疑这种技术。根据我的经验,printf在这种情况下不会截断参数。手册页上说:在任何情况下,不存在的或较小的字段宽度都不会导致字段截断;如果转换结果比字段宽度宽,则字段将展开以包含来自的转换结果。@unwind:您读取了错误的部分。指定的是精度,而不是字段宽度,并且精度对%s有特殊的行为。@unwind-正如jamesdlin正确指出的,在我描述精度时,您指的是字段宽度。仅指定字段宽度时,不使用句点;指定字段宽度和精度时,字段宽度在周期之前,而精度在周期之后。