簡體   English   中英

C++使用ifstream讀取文件

[英]C++ using ifstream to read file

我有一些關於在 C++ 中使用std::ifstream問題。

大多數是我找不到答案的一般問題,因此對其他人也可能有用。

無論如何,我使用#include <fstream>並制作了一個變量char line[20]

有一個文本文件,其中包含幾行模式jxxx (其中x是數字),如下所示:

j1234
j5678
j1111
(and so on)

所以,我這樣做:

#include <iostream>
#include <fstream>

char line[20]
ifstream rfile;
rfile.open("path-to-txt-file");
while (!rfile.eof()) {
    rfile.getline(line, 20); (why is 20 needed here?)
    cout >> data >> endl;
    }
rfile.close();

所以擔心的是:

  1. 為什么在getline方法中需要數字?

  2. line末尾是否自動有\\0 因為當我們創建像char text[5]; text = "abc1"這樣的char變量時char text[5]; text = "abc1" char text[5]; text = "abc1" ,它實際上被保存為"acd1\\0"並且在每個jxxx行之后的文件 ( \\n ) 中的jxxx行會發生什么? (我想在比這更復雜的代碼中使用這些行,所以想知道)

  3. 程序會自動移動到下一行嗎? 如果沒有,我如何告訴它轉到下一行?

  1. 您正在調用std::ifstream::getline() ,它采用指向緩沖區的char*指針進行輸出。 getline()要求您指定該緩沖區的最大大小,以便它不會溢出。 如果您想處理可變長度的行而不用擔心溢出,您應該將line更改為std::string並使用std::getline()代替。

  2. 如果成功, std::ifstream::getline()將空終止輸出緩沖區。 這意味着最多, getline()讀取的值將比請求的最getline() 1,因此請確保在傳入的大小中為空終止符留出空間(如果遇到換行符或 EOF, getline()讀取的值可能會更少)。 至於換行符本身,它們被getline()吞掉,它們不會出現在緩沖區中。

  3. 是的,代碼會自動移動到下一行,所以你可以在循環中繼續調用getline()

旁注:

  • while (!rfile.eof())不好用 使用while (rfile)代替。 或者更好, while (rfile.getline(line, 20)) 無論哪種方式都會解決open()getline()中發生的任何錯誤,但后者確保在getline()失敗時不會調用cout

  • cout >> data >> endl; 也是錯的。 您需要將<<std::cout一起使用,而data應改為line

試試這個:

#include <iostream>
#include <fstream>

char line[20];
std::ifstream rfile;
rfile.open("path-to-txt-file");
if (rfile.is_open()) {
    while (rfile.getline(line, 20)) {
        std::cout << line << std::endl;
    }
    rfile.close();
}

或這個:

#include <iostream>
#include <fstream>
#include <string>

std::string line;
std::ifstream rfile;
rfile.open("path-to-txt-file");
if (rfile.is_open()) {
    while (std::getline(rfile, line)) {
        std::cout << line << std::endl;
    }
    rfile.close();
}
  1. 您提供的數字是要讀取的最大字符數。
  2. 您正在使用的 ifstream.getline 中的最后一個字符是 \\0
  3. 當達到字符數或換行符時,它將返回

聽起來你想要像 getline(stream, &string, delemter ) 一樣使用的 getline 函數,所以在你的情況下

std::string buff;
getline( rfile, buff )

這將讀取文件直到找到換行符並將字符串(減去換行符)存儲在 buff 中

  1. getline() 函數將指向 char 的指針作為參數,它無法知道數組有多大,這就是您必須自己傳遞數字的原因,否則它可能會嘗試將字符讀入數組“外部”的內存中.

請參見在 C++ 中將數組傳遞給函數

  1. 默認情況下,char 數組不是空終止的,它們必須明確地完成(就像 getline() 在這里所做的那樣),但只有當您想將 char 數組用作字符串時才需要它。 通過這種方式,您可以編寫一些將 char* 作為參數的函數,而無需額外的數組大小,即使調用者沒有傳遞它的大小,您也會在遇到 0 時知道字符串的末尾位置你會在你的代碼中使用 getline() 。 這幾乎是 c 風格字符串背后的想法。

暫無
暫無

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

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