我用C编程已经好几年了,所以我一直在努力做一个简单的“从stdin获取文件名和路径,读取文件,打印文件到stdout”任务,我知道不应该这样做是那么难,但是你。这是我的代码:
#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()
,因为我认为它对该程序中的其他内容产生负面影响,所以我希望能够使用{ {1}}
如果有人对我如何解决这个问题或者为什么这不起作用有任何建议,那将非常感激,因为我已经在这已经工作了几个小时并且非常希望继续我的我需要编码的实际程序!
感谢BUNCH
答案 0 :(得分:4)
您必须删除正在读取并存储到'\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;
}