Hỏi cách sử dụng freopen trong C++

Em làm bài, yêu cầu có file .INP và file .OUT
Ông thầy xem lại tài liệu C++ (ông thầy dạy đội tuyển tin, nhưng dạy Pascal mãi nên chẳng nhớ về C++ mấy) thì thấy ghi là thêm 2 dòng

freopen("E:\\Dev-C\\Project\\DAYSO.INP", "r", stdin); // address của file source
freopen("E:\\Dev-C\\Project\\DAYSO.OUT", "w", stdout); 
// Tất nhiên là dùng notepad để tạo file DAYSO.INP trước

Thế nhưng lại báo lỗi stdin, stdout, freopen not declared, mọi người giúp em với

Trong C++ thì thử thay stdin thành cin, stdout thành cout xem thử.

1 Like

Cái này là hàm của C trong stdio.h
Nếu em muốn chuyển sang C++ bỏ .h ở cuối thêm c vào trước

c                                            c++
#include <stdio.h>                   #include <cstdio>
#include <stdlib.h>                  #include <cstdlib>
#include <math.h>                    #include <cmath>
#include <string.h>                  #include <cstring>
#include <ctype.h>                   #include <cctype>
....
3 Likes

E:\Code Block\Project\C++\DAYSO\main.cpp|40|error: invalid user-defined conversion from 'std::istream {aka std::basic_istream<char>}' to 'FILE* {aka _iobuf*}' [-fpermissive]|

E:\Code Block\Project\C++\DAYSO\main.cpp|41|error: invalid user-defined conversion from 'std::ostream {aka std::basic_ostream<char>}' to 'FILE* {aka _iobuf*}' [-fpermissive]|

Hic, em khai báo thư viện cstdio thì nó báo tiếp lỗi này ạ

post code lên xem :confused:

#include <iostream>
#include <conio.h>
#include <cstdio>
#include <cstdlib>
using namespace std;

void InputArr(int A[], int n)
{
    for(int i = 0; i < n; i++){
        cin >> A[i];
    }
}

int CheckFiArr(int A[], int n)
{
    int count = 2, max = 0;
    for(int i = 1; i < n - 2; i++){
        for(int j = i; j < n; j++){
            if(A[j] + A[j - 1] != A[j + 1]){break;}
            if(A[j] + A[j - 1] == A[j + 1]){
                count++;
                max = count > max ? count : max;
            }
        }
        count = 2;
    }
    return max;
}

int main()
{
    freopen("E:\\Code Block\\Project\\C++\\DAYSO.INP", "r", cin);
    freopen("E:\\Code Block\\Project\\C++\\DAYSO.OUT", "w", cout);

    int n, A[30000]; // Day A co n phan tu;

    cin >> n; // dong dau nhap n
    InputArr(A, n); // Nhap n so nguyen

    cout << CheckFiArr(A, n) << endl;

    getch();
    return 0;
}

Và đây là thư mục

FILE * freopen(const char * filename,const char * mod, FILE * stream);
// thay cin =stdin,cout=stdout 

Nếu đã dùng freopen rồi thì đọc từ file chứ dùng cin,cout làm gì?

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cassert>
using namespace std;

// khai báo file nhập xuất tại đây
FILE *inp,*out;
void InputArr(int A[], int n)
{
    for(int i = 0; i < n; i++){
        //cin >> A[i];
        fscanf(inp,"%d",A+i);
    }
}

int CheckFiArr(int A[], int n)
{
    int count = 2, max = 0;
    for(int i = 1; i < n - 2; i++){
        for(int j = i; j < n; j++){
            if(A[j] + A[j - 1] != A[j + 1]){break;}
            if(A[j] + A[j - 1] == A[j + 1]){
                count++;
                max = count > max ? count : max;
            }
        }
        count = 2;
    }
    return max;
}

int  A[30000]; // mảng kích thước lớn đển ở ngoài chương trình con tránh segment fault
int main()
{
    inp=freopen("E:\\Code Block\\Project\\C++\\DAYSO.INP", "r", stdin);
    out=freopen("E:\\Code Block\\Project\\C++\\DAYSO.OUT", "w", stdout);
    assert(inp!=NULL && out!=NULL); // kiem tra 2 file co rong không  
    int n; // Day A co n phan tu;
    

    //cin >> n; // dong dau nhap n
    fscanf(inp,"%d",&n);
    InputArr(A, n); // Nhap n so nguyen

    //cout << CheckFiArr(A, n) << endl;
    fprintf(out,"%d", CheckFiArr(A, n));
    return 0;
}

1 Like

Rồi nó lại bị thế này này chị

Đường dẫn file bị sai xem lại đường dẫn DAYSO.INP đi

inp=freopen("E:\\Code Block\\Project\\C++\\DAYSO\\DAYSO.INP", "r", stdin);
out=freopen("E:\\Code Block\\Project\\C++\\DAYSO\\DAYSO.OUT", "w", stdout);

:man: not :girl:
:disappointed:

3 Likes

Hic, lần đầu đụng tới file, cám ơn mọi người nhiều lắm

1 Like

Chắc do cái avatar của gió dễ thương quá nên mọi người nhầm lẫn.

@nhatlonggunz :+1: chăm chỉ lắm

4 Likes

Bạn thử xem CT sau nhé, chú ý phần đầu!!!

#include<bits/stdc++.h>
using namespace std;
int A[101];

int main(){
freopen("DAYSO.INP","r",stdin);
freopen("DAYSO.OUT","w",stdout);
ios_base::sync_with_stdio(false);
cin.tie(0); cout.tie(0);

cin>>n;
for(int i=1;i<=n;i++){
    cin>>A[i];
}
cout<<n<<endl;
for(int i=1;i<=n;i++) cout<<A[i]<<" ";
return 0;}
1 Like

Sao không tạo fstream mà redirect làm gì cho cực vậy :smiley:

2 Likes

làm sao để đọc đến khi hết file vậy ?

Bạn dùng

  • (1) f.eof() kiểm tra xem đã kết thúc file chưa?
  • (2) nếu chưa, tiếp tục lấy dữ liệu (dòng kế tiếp) từ file vào line.

Tham khảo các đọc file

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?