gpt4 book ai didi

c - 从标准输入读取文件

转载 作者:行者123 更新时间:2023-12-04 10:28:17 25 4
gpt4 key购买 nike

自从我用 C 编程以来已经有很多年了,所以我一直在努力做一个简单的“从标准输入获取文件名和路径,读取文件,将文件打印到标准输出”任务,我知道这不应该那么难但是你。这是我的代码:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

int main(void) {
int c;
FILE *file;
//scanf("%s", filename);
char *filename;
filename = (char *)malloc(200 * sizeof(char));

read(STDIN_FILENO, filename, 200);


printf("%s", filename);

file = fopen(filename, "r");

if (file) {
while ((c = getc(file)) != EOF)
putchar(c);
fclose(file);
} else {
printf("File not found.");
}
printf("\n");

return(0);
}

我的代码继续简单地打印出来 File not found. ,当我知道我的文件路径和所有内容都是正确的时(不仅因为我真的将它从我的文件夹中删除并通过 Mac OSX El Capitan 将其传递到终端 - 多么可爱的功能,而且)因为我有一个不同的版本这个程序使用 scanf它找到了该文件并很好地读取了它(如您所见,我已将其注释掉在我的代码中)。

我正在编写的另一个程序正好使用了这个程序,我去掉了 scanf因为我认为它对该程序中的其他内容产生了负面影响,所以我希望能够使用 read()
如果有人对我如何解决这个问题或为什么这不起作用有任何建议,那将不胜感激,因为我已经在这里工作了几个小时,并且非常想继续我需要的实际程序代码!

感谢一堆

最佳答案

您必须删除 '\n'正在读取并存储到 filename 中的换行符缓冲。

其中之一就是包括 string.h并在阅读文件名后

char *newline = strchr(filename, '\n');
if (newline != NULL)
*newline = '\0';

另外,使用 fgets()而不是 read()因为这样程序更便携。更重要的是, read()不会添加 null终止符对于将缓冲区用作字符串非常重要 - 将其传递给 fopen()例如——正确。如果你想使用 read 尝试这样的事情
ssize_t length;
char filename[200];
length = read(STDIN_FILENO, filename, sizeof(filename) - 1);
if (length <= 0)
return -1; // No input or input error
if (filename[length] == '\n')
filename[--length] = '\0';
else
filename[length] = '\0';

但否则,试试这个更简单的
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

#include <string.h>

int main(void)
{
FILE *file;
char filename[200];
char *newline;

if (fgets(filename, sizeof(filename), stdin) == NULL)
return -1; // Input error / EOF
newline = strchr(filename, '\n');
if (newline) // ? is a newline present?
*newline = '\0';
printf("**%s**\n", filename); // ** will help checking for
// the presence of white spaces.

file = fopen(filename, "r");
if (file) {
int chr;
while ((chr = fgetc(file)) != EOF)
fputc(chr, stdout);
fclose(file);
} else {
printf("File not found.");
}
printf("\n");

return 0;
}

关于c - 从标准输入读取文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37426856/

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