簡體   English   中英

C:修改文件從外部文件讀取

[英]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 等中,文件名中的/不是非法的嗎?),您應該從作為文件名傳遞的字符串文字中刪除./


您發布的“原始”代碼中的編譯錯誤是:

  1. 如果您在某些平台上包含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 行

  1. 一個失蹤; ++i @ line 50 col 12 之后。

此外,與 C 等語言中的大多數 I/O 一樣,您的程序缺少一些基本的錯誤檢查- 非常重要的是,例如,檢查fp == NULL以防fopen()失敗,例如 hello.txt 會發生這種情況不存在,這會很糟糕,因為fclose(NULL)是段錯誤。

當您學習 C 中的(流級)文件 I/O 時,您可能會在隨后了解這一點。

如果您還沒有達到學習基於stdio.h的文件 I/O 的水平,為什么不使用更方便的從控制台重定向輸入的功能呢? 只需執行hello.txt > ./yourprogramhello.txt | ./yourprogram hello.txt | ./yourprogram從終端運行原始教科書代碼時。

適用於基於 UNIX 的系統,甚至 Windows 和 DOS,並且經常用於直接實現文件 I/O 的痛苦不值得的情況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM