gpt4 book ai didi

c - 在 c - wwwmc 中实现 'cat'? (我的代码有什么问题)

转载 作者:行者123 更新时间:2023-11-30 16:00:15 26 4
gpt4 key购买 nike

我的代码在某种程度上运行良好。不过我有两个问题。一,在将文件打印到标准输出结束时,它给了我一个段错误。

二,我无法使用 fputs 打印数据,因为我立即遇到段错误。因此,为了修复它,我使用了 put ,它可以很好地打印它,但在每行后面添加一个 '\n' ,使文本单行间隔以及末尾的段错误。

#include <stdio.h>
#include <string.h>

void concat(char *arg){

char string[256];
FILE *fp = fopen(arg, "r");

while(!feof(fp)){
fgets(string, 256, fp);
//fputs(string, fp);
puts(string);
}

fclose(fp);

}

void stdincat(){

char string[256];
while(!feof(stdin)){
fgets(string, 256, stdin);
fputs(string, stdout);
}
}

int main(int argc, char *argv[]){

char argvalues[256][40];

if(argv[1] == NULL)
stdincat();
else if(argv[1] != NULL){
int i;

for(i=1;i<=(argc);i++){
concat(argv[i]);
}
}

return 0;
}

最佳答案

您在 concat 中注释掉的对 fputs 的调用正在尝试写入 fp,您只是为了阅读而打开它,所以它是毫不奇怪,它不会/不起作用。

除此之外,您的阅读循环: while(!feof(fp)) { (和类似的,除了来自 stdin 而不是 fp )遵循一种熟悉的、普遍存在的反模式——像这样的循环不能/不会/不能正常工作。您通常希望在同一操作中读取并测试是否成功:

while(fgets(string, 256, stdin))
fputs(string, stdout);

编辑:我还应该提到,我希望避免在 concatstdincat 中重复代码。我宁愿传递 FILE * 作为参数进行读取,因此您可以使用相同的代码从 stdin 或其他任意文件读取:

// Warning: untested code.
// error checking omitted for readability.
void catfile(FILE *file) {
char line[256];
while (fgets(line, sizeof(line), file))
puts(line);
}

int main(int argc, char **argv) {
int i;
if (argc == 1)
catfile(stdin);
else for (int i=1; i<argc; i++) {
FILE *infile = fopen(argv[i], "r");
catfile(infile);
fclose(infile);
}
return 0;
}

最后,我要指出的是,如果您只是要复制整个文件,fgets 可能不是完成这项工作的最有效方法。 fread 可能更合适。当您这样做时,您也可以使用二进制模式读取和写入。

关于c - 在 c - wwwmc 中实现 'cat'? (我的代码有什么问题),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7962345/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com