C - If (No File Found) { 使用标准输入 }
C - If (No File Found) { Use standard input }
我有一个从文件读取的程序,但是如果参数数组中没有声明文件,那么我想在终端中从标准输入读取例如:
./program.out test.txt
阅读自test.txt
./program.out
从标准输入读取:
这是我的一些上下文代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
FILE *fr;
char *line;
char *word;
size_t len =256;
int i=0;
int sum=0;
char *vali;
const char delim = ' ';
int flag=0;
int main(int argc, char* argv[]){
line = (char *)malloc(len);
word = (char *)malloc(len);
/*
line = (char *)malloc(sizeof(&len));
word = (char *)malloc(sizeof(&len));
vali = (char *)malloc(sizeof(&len));
*/
fr = fopen(argv[1], "r");
if(fr==NULL){
//fr="/dev/stdin"; <-- Piece of code I need for this Whosebug question
}
while (getline(&line, &len, fr) != -1){
/* printf("%s", line ); */
if(strlen(line) != 1){
sscanf(line,"%s%*[^\n]",word);
printf("%-10s ", word);
char *scores = line + strlen(word) + 1;
/* printf("scores: %s", scores); */
vali=strtok(scores, &delim);
while(vali != NULL){
sum=sum+atoi(vali);
vali = strtok(NULL, &delim);
}
printf("%3d\n", sum);
sum=0;
}
}
fclose(fr);
free(line);
// free(word);
// free(vali);
return 0;
}
更改这些行:
fr = fopen(argv[1], "r");
if(fr==NULL){
//fr="/dev/stdin"; <-- Piece of code I need for this Whosebug question
}
至
if ( argc > 1 )
{
// A file was passed in as the first argument.
// Try to open it.
fr = fopen(argv[1], "r");
if(fr==NULL){
// Deal with the error of not being able to open the file.
}
}
else
{
// Nothing was passed to the program.
// use stdin.
fr = stdin;
}
怎么样:
if(fr==NULL){
fr=stdin;
毕竟都是文件指针
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
FILE *fr;
char *line;
char *word;
size_t len =256;
int i=0;
int sum=0;
这些已经是 0. 40 美元了。
char *vali;
非英文变量名。罚款 50 美元。
const char delim = ' ';
int flag=0;
无故使用全局变量将被处以每字节最高 10 美元的罚款。间距不一致加收20$.
int main(int argc, char* argv[]){
“*”的位置不一致。
line = (char *)malloc(len);
word = (char *)malloc(len);
铸造 malloc 是 50 美元。 http://www.c-faq.com/malloc/mallocnocast.html
/*
line = (char *)malloc(sizeof(&len));
word = (char *)malloc(sizeof(&len));
vali = (char *)malloc(sizeof(&len));
*/
改为考虑 #if 0 ... #endif。
fr = fopen(argv[1], "r");
缩进不一致。
一开始没有检查是否提供了参数。
标准行为是在传递“-”作为名称时打开标准输入。
if(fr==NULL){
//fr="/dev/stdin"; <-- Piece of code I need for this Whosebug question
原理不正确。如果程序无法打开传递的文件,则回退到标准输入是一种犯罪行为,如果没有给出任何指示,则更是如此。
你应该检查你的论点。如果提供了文件但打开失败,打印错误。
最后,有很多默认为 stdin 的 unix 命令行工具,并且有可用的源代码(例如 cat),所以您可以检查一下它们的作用。有趣的是,这里有一个名为 stdin 的 FILE 指针,您可以在这里使用它。
}
while (getline(&line, &len, fr) != -1){
缩进更加不一致。
/* printf("%s", line ); */
if(strlen(line) != 1){
为什么? 'len'没有吗?
sscanf(line,"%s%*[^\n]",word);
什么?这真的可以做得更好。你知道换行符必须在最后并且长度已知。
printf("%-10s ", word);
char *scores = line + strlen(word) + 1;
/* printf("scores: %s", scores); */
vali=strtok(scores, &delim);
while(vali != NULL){
sum=sum+atoi(vali);
vali = strtok(NULL, &delim);
}
printf("%3d\n", sum);
sum=0;
不是很好的人。至少做 sum = 0;就在循环中修改它之前。只是杂散的 sum=0 让人想知道这里发生了什么。 10$.
}
}
fclose(fr);
最后,如果结果是标准输入,则不应执行此操作。
free(line);
// free(word);
// free(vali);
好吧,你分配了单词和行,但没有分配vali所以注释掉的部分是不正确的。
return 0;
}
我有一个从文件读取的程序,但是如果参数数组中没有声明文件,那么我想在终端中从标准输入读取例如:
./program.out test.txt
阅读自test.txt
./program.out
从标准输入读取:
这是我的一些上下文代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
FILE *fr;
char *line;
char *word;
size_t len =256;
int i=0;
int sum=0;
char *vali;
const char delim = ' ';
int flag=0;
int main(int argc, char* argv[]){
line = (char *)malloc(len);
word = (char *)malloc(len);
/*
line = (char *)malloc(sizeof(&len));
word = (char *)malloc(sizeof(&len));
vali = (char *)malloc(sizeof(&len));
*/
fr = fopen(argv[1], "r");
if(fr==NULL){
//fr="/dev/stdin"; <-- Piece of code I need for this Whosebug question
}
while (getline(&line, &len, fr) != -1){
/* printf("%s", line ); */
if(strlen(line) != 1){
sscanf(line,"%s%*[^\n]",word);
printf("%-10s ", word);
char *scores = line + strlen(word) + 1;
/* printf("scores: %s", scores); */
vali=strtok(scores, &delim);
while(vali != NULL){
sum=sum+atoi(vali);
vali = strtok(NULL, &delim);
}
printf("%3d\n", sum);
sum=0;
}
}
fclose(fr);
free(line);
// free(word);
// free(vali);
return 0;
}
更改这些行:
fr = fopen(argv[1], "r");
if(fr==NULL){
//fr="/dev/stdin"; <-- Piece of code I need for this Whosebug question
}
至
if ( argc > 1 )
{
// A file was passed in as the first argument.
// Try to open it.
fr = fopen(argv[1], "r");
if(fr==NULL){
// Deal with the error of not being able to open the file.
}
}
else
{
// Nothing was passed to the program.
// use stdin.
fr = stdin;
}
怎么样:
if(fr==NULL){
fr=stdin;
毕竟都是文件指针
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
FILE *fr;
char *line;
char *word;
size_t len =256;
int i=0;
int sum=0;
这些已经是 0. 40 美元了。
char *vali;
非英文变量名。罚款 50 美元。
const char delim = ' ';
int flag=0;
无故使用全局变量将被处以每字节最高 10 美元的罚款。间距不一致加收20$.
int main(int argc, char* argv[]){
“*”的位置不一致。
line = (char *)malloc(len);
word = (char *)malloc(len);
铸造 malloc 是 50 美元。 http://www.c-faq.com/malloc/mallocnocast.html
/*
line = (char *)malloc(sizeof(&len));
word = (char *)malloc(sizeof(&len));
vali = (char *)malloc(sizeof(&len));
*/
改为考虑 #if 0 ... #endif。
fr = fopen(argv[1], "r");
缩进不一致。
一开始没有检查是否提供了参数。
标准行为是在传递“-”作为名称时打开标准输入。
if(fr==NULL){
//fr="/dev/stdin"; <-- Piece of code I need for this Whosebug question
原理不正确。如果程序无法打开传递的文件,则回退到标准输入是一种犯罪行为,如果没有给出任何指示,则更是如此。
你应该检查你的论点。如果提供了文件但打开失败,打印错误。
最后,有很多默认为 stdin 的 unix 命令行工具,并且有可用的源代码(例如 cat),所以您可以检查一下它们的作用。有趣的是,这里有一个名为 stdin 的 FILE 指针,您可以在这里使用它。
}
while (getline(&line, &len, fr) != -1){
缩进更加不一致。
/* printf("%s", line ); */
if(strlen(line) != 1){
为什么? 'len'没有吗?
sscanf(line,"%s%*[^\n]",word);
什么?这真的可以做得更好。你知道换行符必须在最后并且长度已知。
printf("%-10s ", word);
char *scores = line + strlen(word) + 1;
/* printf("scores: %s", scores); */
vali=strtok(scores, &delim);
while(vali != NULL){
sum=sum+atoi(vali);
vali = strtok(NULL, &delim);
}
printf("%3d\n", sum);
sum=0;
不是很好的人。至少做 sum = 0;就在循环中修改它之前。只是杂散的 sum=0 让人想知道这里发生了什么。 10$.
}
}
fclose(fr);
最后,如果结果是标准输入,则不应执行此操作。
free(line);
// free(word);
// free(vali);
好吧,你分配了单词和行,但没有分配vali所以注释掉的部分是不正确的。
return 0;
}