如何在C中将文件空间加倍?然后打印到STDOUT。

时间:2012-11-01 22:16:26

标签: c file

我需要读取一个文件,然后将其打印到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添加到读取中?但我不完全确定这是否正确或如何做到这一点。

3 个答案:

答案 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)

openclosereadwrite函数特定于Unix(实际上是POSIX)。 C语言标准提供了更高级别的函数集(fopenfclose以及许多输入和输出函数),并且没有充分的理由不在此处使用它们。任何具有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);
}