[英]C: modify file to read from external file
我正在學習The C Programming Language - 2nd Edition ,試圖通過示例進行推理。 我是 C 的新手。
第一章的大部分示例代碼都依賴於getchar()
來接收輸入。 例如,以下代碼返回文本塊中最長的一行:
#include <stdio.h>
#define MAXLINE 1000
int max;
char line[MAXLINE];
char longest[MAXLINE];
int getline(void);
void copy(void);
int main()
{
int len;
extern int max;
extern char longest[];
max = 0;
while ((len = getline()) > 0)
if (len > max) {
max = len;
copy();
}
if (max > 0)
printf("%s", longest);
return 0;
}
int getline(void) {
int c, i;
extern char line[];
for (i = 0; i < MAXLINE-1 && (c=getchar()) != EOF && c != '\n'; ++i)
line[i] = c;
if (c == '\n') {
line[i] = c;
++i;
}
line[i] = '\0';
return i;
}
void copy(void) {
int i;
extern char line[], longest[];
i=0;
while ((longest[i] = line[i]) != '\0')
++i
}
可能是一個簡單的答案,但是我必須做什么才能提供外部文本文件作為該程序的輸入?
編輯:我嘗試了以下操作,但出現編譯錯誤:
#include <stdio.h>
#define MAXLINE 1000
int max;
char line[MAXLINE];
char longest[MAXLINE];
FILE *fp;
int getline(void);
void copy(void);
int main()
{
int len;
extern int max;
extern char longest[];
fp = fopen("./hello.txt", "r");
max = 0;
while ((len = getline()) > 0)
if (len > max) {
max = len;
copy();
}
if (max > 0)
printf("%s", longest);
fclose(fp);
return 0;
}
int getline(void) {
int c, i;
extern char line[];
extern FILE *fp;
for (i = 0; i < MAXLINE-1 && (c=fgetc(fp)) != EOF && c != '\n'; ++i)
line[i] = c;
if (c == '\n') {
line[i] = c;
++i;
}
line[i] = '\0';
return i;
}
void copy(void) {
int i;
extern char line[], longest[];
i=0;
while ((longest[i] = line[i]) != '\0')
++i;
}
fopen("./hello.txt", "r");
打開並緩沖一個名為“./hello.txt”的文件以供閱讀。
除非您的文件確實以./
命名(在 UNIX 等中,文件名中的/
不是非法的嗎?),您應該從作為文件名傳遞的字符串文字中刪除./
。
您發布的“原始”代碼中的編譯錯誤是:
stdio.h
,則無法真正重新定義getline()
,在此處的 MacOS 上,因為它在此處定義/聲明為:
ssize_t getline(char ** __restrict __linep, size_t * __restrict __linecapp, FILE * __restrict __stream)
基本上,將getline()
重命名為一些不同的東西,比如getln()
。
或者,通過在編譯期間向參數添加-stdC99
選項,強制編譯器(此處為 Clang)嚴格在標准(例如 C99)內運行。
這至少在 C 中似乎是非標准的,也許在 C++ 中不是,但這就是 MacOS 的stdio.h
。
准確地說,版本 10.14.6, /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/stdio.h
stdio.h 的第 359 行
;
在++i
@ line 50 col 12 之后。 此外,與 C 等語言中的大多數 I/O 一樣,您的程序缺少一些基本的錯誤檢查- 非常重要的是,例如,檢查fp == NULL
以防fopen()
失敗,例如 hello.txt 會發生這種情況不存在,這會很糟糕,因為fclose(NULL)
是段錯誤。
當您學習 C 中的(流級)文件 I/O 時,您可能會在隨后了解這一點。
如果您還沒有達到學習基於stdio.h
的文件 I/O 的水平,為什么不使用更方便的從控制台重定向輸入的功能呢? 只需執行hello.txt > ./yourprogram
或hello.txt | ./yourprogram
hello.txt | ./yourprogram
從終端運行原始教科書代碼時。
適用於基於 UNIX 的系統,甚至 Windows 和 DOS,並且經常用於直接實現文件 I/O 的痛苦不值得的情況。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.