[英]Implementing 'cat' in c - wwwmc? (What's wrong with my code)
我的代碼在某種程度上可以正常工作。 我有兩個問題。 第一,在將文件打印到標准輸出的末尾,這給了我一個分割錯誤。
第二,我不能使用fputs來打印數據,因為我立即遇到了分段錯誤。 因此,為了修復它,我使用puts將其打印得很好,但在每行之后添加了一個'\\ n',使文本以單行隔開,並在末尾使用seg fault。
#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);
編輯:我還應該提到,我希望避免在concat
和stdincat
重復代碼。 我寧願傳遞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
可能更合適。 在使用它的同時,您也可以使用二進制模式進行讀寫。
你不能寫,你只能讀打開流,你應該在函數CONCAT使用標准輸出為的fputs
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.