【问题标题】:Write to file text from terminal using fgets()使用 fgets() 从终端写入文件文本
【发布时间】:2021-07-28 21:52:52
【问题描述】:
#include <stdio.h> 
#include <cstdio>
int main(int argc, char* argv[]) {
    char buff[512];
    int desc;
    int lb;
    desc = open(argv[1], O_WRONLY);
    if(desc == -1) {
        perror("error");
        exit(1);
    }
    while(lb=fgets(buff,512,stdin) > 0) {
        write(desc,buff,lb);

    }
    
}

在 linux 上的 C 中,我必须使用 fgets() 从用户编写的终端写入作为 argv 文本传递的文件。程序应该在循环中工作,如果用户写“结束”,程序就会停止。 我猜现在程序将从标准输入写入文件文本,不确定如何在“结束”条件下结束程序。

【问题讨论】:

  • 欢迎来到 SO。你可能想看看strcmp()write()
  • 也许fopen(参见示例)比open 更适合编写文本文件。
  • 不确定如何从终端获取文本到缓冲区
  • 注意:open() 是一个非常低级的调用,除非您对无缓冲 IO 有非常特殊的要求,否则不应使用它。请改用fopen()FILE*
  • 警告:除非您绝对确定 n &lt; argc 是真的,否则不要引用 argv[n]。你将使用一个无效的指针。

标签: c linux terminal


【解决方案1】:

“不确定如何从终端获取文本到缓冲区”

fopen() 是更好的选择(open() 上的每个 cmets)。下面假设一个文本文件,并且有效的filespec 在命令行上。它将读取直到看到“结束”,然后将其捕获为最后一行...

( 也会在以下情况下退出:对于 UNIX 系统 Ctrl+D,或 Windows Ctrl+Z.)

#define INSTRUCTIONS "Entered text will be written to file %s.\n\
When finished with desired input press '<enter>end'.\n\
This will close and save the file, and exit the program.\n\
Begin Here:\n"
 

int main(int argc, char *argv[])
{
    char buffer[80] = {0};
    if(argv < 1) 
    {
        printf("missing filespec in command line\nHit any key to exit.");
        getchar();
        return 0;
    }
    printf(INSTRUCTIONS, argv[1]);
    FILE *fp = fopen(argv[1], "w");
    if(fp)
    {
        while(fgets(buffer, sizeof buffer, stdin))//reads until EOF
        {
            fputs(buffer, fp);
            buffer[strcspn(buffer, "\n")] = 0;//clear newline
            //looks for a new line containing only end\n
            if(strcmp(buffer, "end") == 0)
            {
                fclose(fp);
                break;
            }
        }
    }
    return 0;
}
    

【讨论】:

  • 这与示例有何不同?
  • @tadman - 仍在编辑,不应该这么早发布。
  • 很公平,但问题似乎与"end" 匹配部分有关。
猜你喜欢
  • 1970-01-01
  • 2017-07-07
  • 1970-01-01
  • 2014-09-16
  • 2019-09-17
  • 1970-01-01
  • 1970-01-01
  • 2021-03-06
  • 2019-09-28
相关资源
最近更新 更多