我需要读取一个文件,然后将其打印到STDOUT但是双倍间隔。到目前为止我所拥有的是:
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#define BUFSZ 1024
int main(int argc, char* argv[]){
int n, fdin;
char buf[BUFSZ];
if ((fdin=open(argv[1],O_RDONLY))<0){
perror(argv[1]);
exit(-1);
}
while(( n = read(fdin, buf, BUFSZ))>0){
if(write(STDOUT_FILENO,buf,n) != n){
fprintf(stderr, "Write Error\n");
exit(-1);
}
printf("\n");
}
close(fdin);
return(0);
}
我是C的新手并且不知道如何在代码中实现\ n,我的printf(“\ n”)在尝试将整个文件的内容加倍空间时毫无用处。我想我必须将\ n添加到读取中?但我不完全确定这是否正确或如何做到这一点。
答案 0 :(得分:7)
read()
在遇到换行符时不会停止读取,因此发布的代码中的算法很容易错过写一个空行,因为read()
可以读取多行。
更简单的方法是使用fgets()
:
FILE* f = fopen(argv[1], "r");
if (f)
{
char buf[BUFSZ];
while (fgets(buf, BUFSZ, f))
{
printf("%s", buf);
/* fgets() may not have read a full line if the
length of the line was greater than BUFSZ,
so check it did before double spacing. */
if (strrchr(buf, '\n')) printf("\n");
}
fclose(f);
}
答案 1 :(得分:2)
open
,close
,read
和write
函数特定于Unix(实际上是POSIX)。 C语言标准提供了更高级别的函数集(fopen
,fclose
以及许多输入和输出函数),并且没有充分的理由不在此处使用它们。任何具有POSIX特定功能的系统都将具有标准C功能;反过来不一定是真的。
我不确定我应该给你一个完整解决方案的代码(这是这个功课吗?),但我会给你一个快速的大纲。
无需读写全行。通过读写单个字符可以轻松解决这个问题 - 而C的I / O函数可以进行隐式缓冲,因此不会导致任何重大的性能问题。
“line”只是一个由换行符'\n'
字符终止的字符序列。 (不要担心不同的行尾表示,例如Windows使用的\r\n
;如果以文本模式打开文件,C库将负责转换到C的内部{{1表示。)
从输入文件一次读取一个字符。对于您阅读的每个字符,请将相同的字符写入标准输出。此外,如果输入字符为'\n'
,请将第二个 '\n'
写入标准输出。
有类似的问题需要一次将整行读入内存(这意味着你需要担心一行可以有多长时间),但是对于这个特殊问题,没有必要。
答案 2 :(得分:1)
使用fgets puts和putc,它更加简单和缓冲。 并且fgets读取行,
int main(int argc, char* argv[]){
FILE *fp;
char *s;
char buf[BUFSZ];
if ((fp = fopen(argv[1],"r")) == NULL) {
fprintf(stderr, "Error opening %s\n", argv[1] );
exit(-1);
}
while((s = fgets(buf, sizeof buf, fp)) != NULL){
puts(s);
putchar('\n');
}
fclose(fp);
return(0);
}